如何使用32位机器在PHP中打印40位数字

我试图在PHP中打印一个40位的数字。 但是,当使用Windows机器时,它只允许32位整数这是导致我的代码回显错误的结果。 下面的代码示例:

function decoded_microchip_id($coded_string) { $manufacturer = substr($coded_string, 0, 3); $manufacturer = hexdec($manufacturer); $manufacturer = $manufacturer / 4; $device_id = substr($coded_string, 2, 11); $device_id = hexdec($device_id); $device_id = $device_id & 0x3fffffffff; echo $manufacturer.'.'.$device_id; }; decoded_microchip_id('f58e29a43c67'); 

上面代码的正确输出是:982.60828171367

但在我的32位Windows环境中,我得到:982.698629223

在各种PHP沙箱中testing代码时,输​​出也会变化。

下面是一个沙箱环​​境的示例,它提供了正确的输出: http : //sandbox.onlinephpfunctions.com/code/83cc28fd5314557e7a9d86d8061e1c8dfae4d1b7

这里是一个产生错误输出的环境的例子: http : //codepad.org/m2ygOgC6

有没有人知道解决这个问题或解决scheme。

谢谢。

PHP函数hexdec()适用于32位。 文件说,当结果不符合32位时它会产生float

有趣的是, 0x3fffffffff也存储为一个float

罪魁祸首是似乎产生一个整数的按位运算符( & )。 将结果转换为浮点数不会有帮助,损坏已经完成。

记录此行为:

两个操作数将被转换为整数,结果将是一个整数。

潜在的解决方案

您可以尝试将输入字符串拆分为32位的数据块,并使用位运算符,然后使用加法和乘法生成最终值(加法和乘法将结果转换为浮点,如果它不适合32位)。

具体的解决方案

对于这种情况,更简单的解决方案是将十六进制字符串转换为其编码数字的二进制表示,提取每个组件所需的位,然后将这些值转换为十进制。 在这种情况下不涉及任何操作(除了转换,但这些操作似乎正常)。

 function decoded_microchip_id($coded_string) { // Convert to binary $bin = base_convert($coded_string, 16, 2); // Split to 10/38 bits $manufacturer = substr($bin, 0, 10); $device_id = substr($bin, 10, 38); // Convert to decimal $manufacturer = bindec($manufacturer); $device_id = bindec($device_id); // Put pieces back return $manufacturer.'.'.$device_id; }