Unpack() 在不同的机器上提供不同的结果

Posted

技术标签:

【中文标题】Unpack() 在不同的机器上提供不同的结果【英文标题】:Unpack() delivers different results on different machines 【发布时间】:2015-07-13 18:14:52 【问题描述】:

我对 unpack 函数有一些奇怪的行为。我有一个打包的字符串,作为 longblob 存储在 mysql 数据库中。当我读到那个字符串并解压它时,它给了我一个数组,到目前为止一切都很好。但是当我在另一台机器上运行它时,数组中的一些值是不同的。

当我从 mysql 转储数据时,它们在两台机器上都是相等的。

拆包是这样完成的:

$array = unpack("N*", $packed); 

$array 应该是这样的(并且它在一台机器上)

Array
(
    [1]  => 179848175
    [2]  => -16214255
    [3]  => 179848175
    [4]  => -16214255
    [5]  => 179848175
    [6]  => -16214255
    [7]  => 179999949
    [8]  => -16152916
    [9]  => 179999277
    [10] => -16168574
...
)

但在另一台机器上是这样的:

Array
(
    [1]  => 179848175
    [2]  => 427853622
    [3]  => 179848175
    [4]  => 427853622
    [5]  => 179848175
    [6]  => 427853622
    [7]  => 179999949
    [8]  => 427853423
    [9]  => 179999277
    [10] => 427853341
...
)

每一秒的值似乎都不同。

我已经在三台不同的机器上进行了测试,在两台机器上一切都很好,但是在一台机器上我得到了奇怪的输出。

一台机器运行 php 5.6.3(这里没问题),两台机器运行 PHP 5.5.14(一台正常,另一台不行)

【问题讨论】:

一台机器运行 32 位 PHP 而另一台运行 64 位 PHP? 不确定,uname -a 在两台机器上都给我带来了“x86_64”。有没有办法,如果一个是 32 另一个是 64? echo PHP_INT_SIZE * 8; 从内部检查常量PHP_INT_MAX(值2147483647表示32位)或PHP_INT_SIZE(值4表示32位,8是64位)的值PHP 脚本...仅仅因为操作系统是 64 位的,并不意味着它运行的 PHP 是 64 位 好的,刚刚在它工作的机器上做了,echo PHP_INT_SIZE 显示 4。不幸的是,我现在无法检查非工作机器,因为直到明天我才能访问它。如果是 64 位 PHP,有没有办法处理? 【参考方案1】:

pack 格式 N 表示 unsigned long,这意味着它不能为负数。但是,您存储的是负值,并且它们没有按照您想要的方式解包。 PHP 没有pack 格式用于与机器无关的签名 long;它只支持以机器字节顺序打包它们,这可能在机器之间不兼容。因此,您必须自己对值进行签名。

要将数组项转换为有符号值:

for ($i = 1; $i <= count($array); $i++) 
    // Check for a greater-than-32-bit environment,
    // and check if the number should be negative
    // (i.e., if the high bit is set in 32-bit notation).
    if (PHP_INT_SIZE > 4 && $array[$i] & 0x80000000) 
        // A negative number was unpacked as an unsigned
        // long in a greater-than-32-bit environment.
        // Subtract the appropriate amount (max 32-bit
        // unsigned long + 1) to convert it to negative.
        $array[$i] = $array[$i] - 0x100000000;
    


var_dump($array);

【讨论】:

谢谢!一旦我再次可以访问机器,我会检查这个!

以上是关于Unpack() 在不同的机器上提供不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

脚本在不同的机器上返回不同的结果

为啥 java.awt.Font.getStringBounds 在不同的机器上给出不同的结果?

相同的 Cypress 测试使用 Chrome 和 Electron 在不同的机器上报告不同的结果

SQL Server:BINARY_CHECKSUM 为相同的值提供不同的结果

vs2010编写的代码在不同机器调试,运行结果不同,怎么回事

跨不同系统(机器)使用相同 random_state 的 Sklearn 不同结果