PHP中与Python的struct格式相当的实现

0 投票
2 回答
798 浏览
提问于 2025-04-18 09:16

我正在尝试把Python代码转换成PHP代码。但是我找不到PHP中与Python的pack格式相对应的格式。

Python:

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

我这样使用:

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

因为在PHP的pack中没有!或Q这两个符号。

有没有办法实现这个呢?

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

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

谢谢!

2 个回答

0

如果你把一个8字节的无符号长整型(unsigned long long)拆分成两个4字节的无符号长整型(在PHP中是NN格式),那么你可以把第一个长整型向右移动32位,然后把它和第二个长整型相加,这样就能恢复出那个8字节的无符号长整型。在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
0

下面这个序列:

!LLLL

表示的是4个无符号长整型(32位),采用的是大端格式。在PHP中,这样写:

NNNN

不过,最后的Q有点问题。它表示的是一个无符号长长整型(64位)。PHP的pack函数似乎不支持无符号长长整型(如果我错了,请纠正我)。

撰写回答