首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解包()在不同的机器上交付不同的结果

解包()在不同的机器上交付不同的结果
EN

Stack Overflow用户
提问于 2015-07-13 18:14:52
回答 1查看 217关注 0票数 1

我对解压功能有一些奇怪的行为。我有一个打包的字符串,作为longblob存储在mysql数据库中。当我读取该字符串并解压它时,它会给我一个数组,到目前为止还不错。但是当我在另一台机器上运行时,数组中的一些值是不同的。

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

拆箱是这样做的:

代码语言:javascript
运行
复制
$array = unpack("N*", $packed); 

然后,$array应该是这样的(而且它在一台机器上)

代码语言:javascript
运行
复制
Array
(
    [1]  => 179848175
    [2]  => -16214255
    [3]  => 179848175
    [4]  => -16214255
    [5]  => 179848175
    [6]  => -16214255
    [7]  => 179999949
    [8]  => -16152916
    [9]  => 179999277
    [10] => -16168574
...
)

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

代码语言:javascript
运行
复制
Array
(
    [1]  => 179848175
    [2]  => 427853622
    [3]  => 179848175
    [4]  => 427853622
    [5]  => 179848175
    [6]  => 427853622
    [7]  => 179999949
    [8]  => 427853423
    [9]  => 179999277
    [10] => 427853341
...
)

每一秒的价值似乎都不同。

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

一台机器正在运行PHP5.6.3(这里是ok的),两台机器运行的是PHP5.5.14(其中一台运行正常,另一台不运行)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 18:40:47

pack格式N表示无符号长,这意味着它不可能是负的。但是,您存储的是负值,而它们并不是按您所希望的方式解压的。PHP没有独立于机器的pack格式;它只支持按机器字节顺序打包它们,而机器之间的字节顺序可能不兼容。因此,您必须自己签名这些值。

若要将数组项转换为有符号值,请执行以下操作:

代码语言:javascript
运行
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31390533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档