gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:28:41 25 4
gpt4 key购买 nike

我正在尝试在 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 沙箱中测试代码时,输​​出也会有所不同。

这里是一个沙箱环​​境的例子,给出了正确的输出: http://sandbox.onlinephpfunctions.com/code/83cc28fd5314557e7a9d86d8061e1c8dfae4d1b7

下面是一个产生错误输出的环境示例: http://codepad.org/m2ygOgC6

有没有人知道解决这个问题的方法或解决方案。

谢谢。

最佳答案

PHP 函数 hexdec()在 32 位上也能正常工作。文档说当结果不适合 32 位时它会生成 float 数字。

有趣的是 0x3fffffffff 也存储为 float 数字。

罪魁祸首是位运算符 (&),它似乎生成一个整数。将其结果转换为 float 无济于事,损害已经造成。

此行为是 documented :

both operands will be converted to integers and the result will be an integer.

一个潜在的解决方案

您可以尝试将输入字符串拆分为适合 32 位的片段,并对它们使用按位运算符,然后使用加法和乘法生成最终值(如果不能适合 32 位,加法和乘法会将结果转换为 float ).

一个具体的解决方案

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

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;
}

关于php - 如何使用 32 位机器在 PHP 中打印 40 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29118708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com