我需要阅读PHP中的二进制文件,搜索位置,扭转其位并操纵结果. 目前我的代码看起来像这样: $src_file = "firmware/shapeshifter_v2.02.jic"; $offset = 983195; if ($src_handle = fopen($src_file,"rb")) { fseek($src_handle, $offset); $src_content = fread($src_handle, 1024); fclose($src_handle); $src_content = $src_content & 128 >> 7 + $src_content & 64 >> 5 + $src_content & 32 >> 3 + $src_content & 16 >> 1 + $src_content & 8
以下是关于 bit-manipulation 的编程技术问答
我在php.net上找到了此功能.它似乎对正数有效,但失败了: function gmp_shiftr($x,$n) { // shift right return(gmp_div($x,gmp_pow(2,$n))); } echo -1 >> 8; //returns -1, presumably correctly echo "
"; echo gmp_strval(gmp_shiftr(-1,8)); //returns 0, presumably incorrectly 我该如何解决该功能以与负面处理? 我有两个想法: 也许我可以按照 的线路做一些事情 if (whatever) { $a >> $b} else{ gmp_shiftr($a, $b) }? 或者,也许我可以根据其价值从负面结果中减去一些东西..? 我只想获得>>的价值,但是当我使用GMP时,也以> 32位的数字获得. 解决方案 查看void mpz
当我尝试在PHP和JS中执行位XOR操作时,它们在某些情况下会产生不同的结果,例如 2166136261 ^ 101 = -2128831072 on browsers (js) 2166136261 ^ 101 = 2166136224(php) 我的理解是因为PHP运行64位,而不是32位JS. 任何人都可以告诉我确切的原因,如果可以解决此问题,以便两种操作都会产生相同的价值.谢谢! 解决方案 2,147,483,647是32位计算中整数最大的正值(2^16,我们拥有的32位中的一半,另一半以负数为负.) .) ) 使用比32位系统大的数字一旦使用的数字就开始获得螺旋式结果,因为计算机认为这是一个负数.参见 https://en.wikipedia.org/wiki/wiki/integer_(computer_science)/p>
我正在寻找一种在64位版本的PHP 5.5.14中使用JavaScript中使用>>>函数的方法.我找到了此功能在我的Google中: function uRShift($a, $b) { $z = hexdec(80000000); if ($z & $a) { $a = ($a >> 1); $a &= (~$z); $a |= 0x40000000; $a = ($a >> ($b - 1)); } else { $a = ($a >> $b); } return $a; } 此功能似乎对正数正常,但是在负数时我会得到不同的结果. 例如: php: In: echo uRShift(-672461345, 25); Out: -149 JavaScript(Chrome 35): In: -6
我正在研究一个功能,该功能会涉及一系列许可字符串,少于255个字符,并将其分配给实体.分配的每个字符串都是唯一的,但是有很多人将它们放入数组中,序列化并将其推入数据库,然后将其拉出并将其删除,或者每次造成延迟时,都会从查询中进行重新计算或从查询中重新计算.问题.特别是在继承权限的情况下. 所以我正在考虑拿起绳子,然后从中产生一个口罩,然后进入权限地球.随着更多的权限继续添加或将其添加到全球.然后,当您需要验证许可和针对地球的字符串时. 问题是如何生成面具.起初,我只是想只是为独特的面具哈西弦,但是可以想象,但是我不知道有多大的可能性,因为越来越多的哈希价值是在全球上添加的可能性他们没有允许的方式和测试,但还没有返回真实价值. if($glob&&$test == $test) 另一个选项将只是自动划分许可字符串,并让其面具为2^自动数.但这将将许可字符串的数量限制在64ish左右. 我真正想要的是某种形式的地球,我可以一次从数据库中撤出并将其与用户关联.然后对
我可以知道如何做PHP >>>?此类操作员在PHP中不可用,但可在JavaScript中使用. 我刚刚设法发现了一个功能: function zeroFill($a, $b) { $z = hexdec(80000000); if ($z & $a) { $a = ($a>>1); $a &= (~$z); $a |= 0x40000000; $a = ($a>>($b-1)); } else { $a = ($a>>$b); } return $a; } ,但不幸的是,它不能完美地工作. eg:-1149025787 >>> 0 JavaScript返回3145941509 php zerofill
此代码是什么意思,其他方法在不使用位移动的情况下完成了什么相同的方法? if ($n & ($n - 1)) 解决方案 该公式检查查看一个数字是否是2 (如果您的条件为true,则该数字是 的功率). 用另一种方式表示,您的测试检查以查看$n的二进制表示中是否设置了一个以上的" 1"位.如果设置为零或仅设置一个位,则您的测试将是错误的. 这是迄今为止确定该属性的最有效方法. 其他解决方案 首先,此代码是有效的PHP,因此您的标题很差. 第二,二进制算术进行看起来像这样: 42 = 101010 & 41 = 101001 ----------- 40 = 101000 像格雷格(Greg)一样,这是检查2个数字功率的最快方法,但是您给了检查的代码以查看数字是否不是2 的功率. PHP的策略可以轻松确定:任何非零/非零值都是TRUE. 其他解决方案 当我们使用($ n&($ n -1))时,它将$ n&($ n -1)转换为其二
如果我有一系列标志,我想将它们与位连词结合 IE: $foo = array(flag1, flag2); 进入 $bar = flag1 | flag2; PHP是否具有任何好的功能可以为我做得很好吗? 解决方案 array_reduce 会将一个数组减少到您的单个值: $res = array_reduce($array, function($a, $b) { return $a | $b; }, 0); 减少有时也称为其他语言的折叠(向左或向右折叠). 其他解决方案 您可以像这样做 $bar = $foo[0] | $foo[1] 如果阵列的大小未知,则可以使用 array_reduce 喜欢 // in php > 5.3 $values = array_reduce($flagArray, function($a, $b) { return $a | $b; }); // in php
我对位运算符不熟悉,但我似乎已经用来存储简单的设置. 我需要将多个开/关选项传递给一个函数,我想为此使用一个整数.我该如何设置和阅读这些选项? 解决方案 您肯定可以在php中进行. 假设您有四个布尔值,您想以一个值存储.这意味着我们需要四个存储空间 0000 单独设置时,每个位在十进制中具有唯一的表示 0001 = 1 // or 2^0 0010 = 2 // or 2^1 0100 = 4 // or 2^2 1000 = 8 // or 2^3 实现此目的的一种常见方法是用位掩码来表示每个选项.例如,PHP的错误级别是这样完成的. define( 'OPT_1', 1 ); define( 'OPT_2', 2 ); define( 'OPT_3', 4 ); define( 'OPT_4', 8 ); 然后,当您具有表示这些标志0或多个的整数时,您可以与& 的位和操作员一起检查 $options = bindec( '0101
我一直试图找出长时间使用PHP中使用BitMask或Bitfields的最佳方法,用于用于不同用户设置和权限的应用程序的不同领域.我到目前为止最遥远的是堆栈中的svens贡献的课程 POST for for设置中的php中的bitmask? .我在下面进行了稍微修改,将其更改为使用类常数而不是定义,并确保仅通过INT将GET方法通过.我也有一些示例代码来测试下面的班级功能. 我正在寻找任何建议/代码来改进该课程,以便在我的设置应用程序中使用,在某些情况下可以使用用户权限. 在下面的评论中回答了Mcrumley 此外,我还有一个关于我常数编号的疑问.在此类类型的其他类和代码样本中,它将以2的功率列出.但是,即使我编号我的常数为1,2,3,4,5,6,它似乎也有效.而不是1、2、4、8、16等.因此,有人也可以澄清我是否应该更改常数? 一些想法...我真的很想找出一种扩展此类课程的方法,以便易于与其他类一起使用.假设我有一个User课程和Messages类. User
可能的重复: 这是什么意思〜在这里〜操作员是什么意思? bit在PHP(或任何其他语言)中不操作(或任何其他语言) 有人可以在PHP中向我解释~操作员吗?我知道这是一个 not-operator 遵循变量减去的负值的说明? $a = 1; echo ~$a // echo -2 $a = 2; echo ~$a // echo -3 $a = 3; echo ~$a // echo -4 解决方案 这被称为二的补体算术.您可以阅读更详细的信息. 操作员~是二进制负操作员(而不是布尔否定),并且它会倒置其操作数的所有位.结果是两个补体算术中的负数. 其他解决方案 它不是一个. 它将所有1s转换为0,将所有0s转换为1s.因此1变为-2(二进制表示中的0B11111111110). 看看文档 http://php.net/manual/manual/en/language.operators.bitwise.bitwi
在将其标记为重复之前,请阅读下面,并检查 我的代码 * 我的更新代码! 所以我的问题是,我必须实现java/javascript'>>>'(未签名的正确偏移/零填充右偏移),但我无法以完全相同的方式工作. 我选择了我在SO和Web上找到的11个最有希望的实现(链接在代码中作为注释)并添加了一些测试用例.不幸的是,无功能的无对所有测试返回与Java/js相同的响应. (也许其中一些仅在32位系统上工作) 实时代码 + JS + PHP结果演示(单击运行): http://phpfiddle.org/main/code/code/code/dpkw-rxfe > 最接近的功能是: // http://stackoverflow.com/a/27263298 function shr9($a,$b) { if($a>=0) return $a>>$b; if($b==0) return (($a>>1)&0x7fffffff)*2+(($a>>$b
我知道,对于低级编程,例如编写设备驱动程序,低级图形,通信协议数据包组件和解码是必需的.我从事PHP已经有好几年了,而且我很少在PHP项目中看到位操作. 您可以给我使用示例吗? 解决方案 您可以将其用于BitMasks来编码事物的组合.基本上,它可以通过给出每个含义来起作用,因此,如果您具有00000000,则每个位也代表了某些东西,除了一个小数号.假设我对要存储的用户有一些偏好,但是我的数据库在存储方面非常有限.我可以简单地存储小数号并从中衍生出来,例如选择哪些首选项,例如9 IS 2^3 + 2^0是00001001,因此用户具有首选项和偏好4. 00000000 Meaning Bin Dec | Examples │││││││└ Preference 1 2^0 1 | Pref 1+2 is Dec 3 is 00000011 ││││││└─ Preference 2 2^1 2 | Pref 1+
我正在尝试以标志为参数创建一个函数,但是输出与预期的函数总是不同的: define("FLAG_A", 1); define("FLAG_B", 4); define("FLAG_C", 7); function test_flags($flags) { if($flags & FLAG_A) echo "A"; if($flags & FLAG_B) echo "B"; if($flags & FLAG_C) echo "C"; } test_flags(FLAG_B | FLAG_C); # Output is always ABC, not BC 如何解决此问题? 解决方案 标志必须是2的功率,才能正确地或合适. define("FLAG_A", 0x1); define("FLAG_B", 0x2); define("FLAG_C", 0x4); function test_flags($flags) { i
我经常在我的代码中使用($var & 1),如果$var为奇数,则返回true,如果是偶数,则false. 但是"&"实际做什么? 解决方案 &是二进制and.如果您具有二进制值,并且and带有另一个二进制值,则结果将是两者的位and.一个例子: 01101010 & 01011001 = 01001000 最右边的位是1(在那种情况下,数字为奇数),或者是0,在这种情况下,数字甚至是.如果您的数字为1,则仅查看最小的位,以及IF检查数字是否为1或A.正如其他人所提到的,请查看Bitwise Operators以获取有关其工作方式的信息. 其他解决方案 两个对二进制系统至关重要的操作是或和和. 或表示'如果A打开或B正在打开'.真实的示例将是两个并行的开关.如果两者都允许电流通过,则电流通过. ,意思是'如果A和B都打开'.现实世界的示例是串联的两个开关.当两者都允许电流通过时,电流才会通过. 在计算机中,这些不是物理开关,而是半导体
我想将此C#权限模块移植到Java,但是当我无法保存数据库中的数字值并将其施放到枚举表示时,我会感到困惑. . 在C#中,我创建了这样的枚举: public enum ArticlePermission { CanRead = 1, CanWrite = 2, CanDelete = 4, CanMove = 16 } i然后可以创建一个权限集,例如: ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove; 然后,我使用以下方式将其保存到数据库中. (int)johnsArticlePermission 现在,我可以从数据库中读取整数/long,然后像以下内容一样. johnsArticlePermission = (ArticlePermission) d
我只是想知道该代码会发生什么. 为什么直接直接打印结果的结果是不正确的,为什么忽略了新线? user@host_09:22 AM: perl print 2 >> 1, "\n"; print 2 & 2, "\n"; print (2 & 2) >> 1, "\n"; 1 2 2user@host_09:22 AM: perl $a = (2 & 2) >> 1; print "$a\n"; 1 解决方案 当您用警告打印时,它变得清晰(er) perl -we'print (2 & 2), "\n"' 说 print (...) interpreted as function at -e line 1. Useless use of a constant ("\n") in void context at -e line 1. 它可以使用print (2&2)作为函数调用print †和适当打印2(无newline!),然后继续评估逗号运算符,"\n"在