PHP中如何将64位整数转换为8位等效值?
如何将数字转换为8位等效值
你的问题核心在于:你只是对二进制字符串做了截取,但并没有真正修改数值本身的位结构——PHP中的整数默认是64位(取决于系统架构),所以即使你截取了8位的二进制字符串,当你把它转回整数时,PHP还是会把它当作普通64位整数处理,而不是真正的8位等效值。
错误原因分析
你当前的代码仅作用于字符串层面,并没有对数值本身进行位截断:
$fileKey = 257; $bin = decbin($fileKey); // 输出 "100000001" $subBin = substr($bin, strlen($bin)-8, 8); // 输出 "00000001"
此时$subBin只是一个字符串形式的二进制数,虽然用bindec($subBin)转成整数后结果是1(对应8位等效值),但这个过程绕了弯路;而且如果原数字的二进制长度不足8位(比如$fileKey=10,decbin输出1010),截取最后8位会得到不完整的1010,而非你需要的补前导0的00001010。
最优解决方案:使用位运算
直接用**按位与运算符(&)**和0xFF(二进制11111111)进行运算,这会在二进制层面直接截断,只保留数字的最后8位,得到真正的8位无符号整数等效值:
$fileKey = 257; $eightBitValue = $fileKey & 0xFF; var_dump($eightBitValue); // 输出 int(1)
这个方法效率远高于字符串处理,结果就是你需要的8位等效数值。
如果需要完整的8位二进制字符串
如果你的目标是得到补全前导0的8位二进制字符串,可以结合位运算和字符串补全:
$fileKey = 10; $eightBitValue = $fileKey & 0xFF; $eightBitBin = str_pad(decbin($eightBitValue), 8, '0', STR_PAD_LEFT); var_dump($eightBitBin); // 输出 string(8) "00001010"
扩展:有符号8位整数
如果需要的是有符号8位整数(范围-128到127),可以在得到无符号值后做转换:
$eightBitValue = $fileKey & 0xFF; $signedEightBit = ($eightBitValue > 127) ? $eightBitValue - 256 : $eightBitValue; var_dump($signedEightBit); // 比如$fileKey=255时,输出 int(-1)
内容的提问来源于stack exchange,提问作者Zeyukan Ich'
相关产品推荐
相关产品推荐

