PHP等同于Python的struct格式

时间:2014-06-10 12:38:33

标签: php python struct pack unpack

我正在尝试将Python代码写入PHP。但我不能将PHP打包格式等同于Python包格式

Python:

format = "!LLLLQ"
mystr = struct.unpack(format, str)

我正在使用这个

$mystr = unpack("!LLLLQ", $str); // But its not working

因为没有!或PHP中的Q包。

无论如何要实现这个目标吗?

Python的格式代码:https://docs.python.org/2/library/struct.html

PHP的格式代码:http://www.php.net/manual/en/function.pack.php

谢谢!

2 个答案:

答案 0 :(得分:0)

以下序列:

!LLLL

表示大端格式的4个无符号长整数(32位)。在PHP中,这将是:

NNNN

然而,最后的Q是有问题的。它表示无符号长整型(64位)。 PHP的打包功能并不能提供无符号的多头(如果我错了,请纠正我)。

答案 1 :(得分:0)

如果使用两个4字节无符号长整数(PHP中为NN格式)解包8字节无符号长整数,则可以对第一个长32位进行位移,并将其添加到第二个长整数恢复8字节无符号长long。在Python中,

In [49]: import struct

In [50]: c = 12345678912345678912

In [51]: struct.pack('!Q', c)    # this is the packed string
Out[51]: '\xabT\xa9\x8f\x81e$@'

# unpack the string using `NN` in PHP   
In [52]: a, b = struct.unpack('!LL', struct.pack('!Q', c))  

In [53]: a, b
Out[53]: (2874452367L, 2170889280L)

这将第一个数字移位32位,然后将其加到第二个数字。

In [54]: (a<<32)+b
Out[54]: 12345678912345678912L

这表明原始号码c已恢复:

In [55]: assert (a<<32)+b == c