【问题标题】:Bitwise operation error?按位运算错误?
【发布时间】:2010-08-13 17:53:35
【问题描述】:

我正在开发一个有趣的网站,我正在尝试实现基于位运算符的目录访问控制。
我已经定义了GUEST = 1, GROUP1 = 15 and GROUP2 = 23

如果我比较

echo (23 & 1); // print 1 

但如果我定义GUESTGROUP1GROUP2

define('GUEST', 1);  
define('GROUP1', 15);  
define('GROUP2', 23);  
// and then  
echo (GROUP2 & GUEST); // print 0  
echo USER_GUEST.','.USER_ROLES1.','.USER_ROLES2; // print 1,15,23` 

GROUP1没问题:

echo (GROUP1 & GUEST); print 1.  

我哪里错了?一些建议? 谢谢。


我发现了一些非常奇怪的东西:我的 GUEST、GROUP1 和 GROUP2 在一个 ini 文件中声明,我通过函数 parse_ini_file(self::$fileName, true); 解析该文件。一个班级内。 在我解析了文件后,我递归地定义了在 [DEFINE] 部分下定义的键=值(一个简单的技巧)。 如果我在此处评论我的 GROUP2=23 定义并在当前脚本(GROUP2 和 GUEST)中声明它,则返回 1!

【问题讨论】:

  • 我已经在 PHP 4.4 和 5.2 以及 echo(GROUP2 & GUEST); prints 1 中测试了你的代码
  • GROUP2 & GUEST 也向我返回 1。

标签: php bitwise-operators bitwise-and


【解决方案1】:

确保您的组使用以 2 为底的数字,即 1,2,34,8,16,32.... 或者您可以互相踩踏。这是在位域中执行权限的正确方法。

define('GUEST', 1);  
define('GROUP1', 2);  
define('GROUP2', 4);
$groups |= GUEST;
$groups |= GROUP1;
if($groups & GUEST) {
    // This user is a guest (it is)
}
if($groups & GROUP1) {
    // This user is in group 1 (it is)
}
if($groups & GROUP2) {
    // This user is in group 2 (it is NOT)
}

【讨论】:

  • 这完全不正确,23 & 1 != 0。虽然从其他答案/cmets 听起来这是一个本地化问题,但 PHP 正在为其他所有人返回正确答案 (1)
  • 是的,我没听懂他在说什么。
【解决方案2】:

PHP 5.3:

php > define('GUEST', 1);
php > define('GROUP1', 15);
php > define('GROUP2', 23);
php > echo GROUP2 & GUEST;
1
php > echo GROUP1 & GUEST;
1

您使用的是什么 PHP 版本?


Artefacto 指出了一个可能的字符串问题(e:但似乎已经撤回了他的帖子,嗯)。再次在 5.3 中:

php > var_export(GUEST);
1
php > var_export(GROUP1);
15
php > var_export(GROUP2);
23
php > define('GUEST_AS_STRING', '1');
php > var_export(GUEST_AS_STRING);
'1'
php > echo GROUP1 & GUEST_AS_STRING;
1
php > echo GROUP2 & GUEST_AS_STRING;
1

'1' 是字符 49。49 & 15 是 1,但 49 & 23 是 17。我不相信这是一个字符串问题...

【讨论】:

  • 我正在谷歌上搜索一些信息。测试服务器上安装的版本是 PHP Version 5.2.9。目前我无法在不同版本上测试它
【解决方案3】:

解决了。
我完全误解了php manual 中的声明,他们在 Changelog 中说:

5.2.4 由数字组成的键和节名现在被评估为 PHP 整数,因此以 0 开头的数字被评估为八进制,以 0x 开头的数字被评估为十六进制。

非常清楚:键和部分名称......不是值!
parse_ini_file() 函数将整数值计算为 PHP 字符串,即使它们没有用双引号括起来。这很可惜,但事实就是如此;-)

感谢您的合作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多