繁体   English   中英

PHP等同于Python的结构格式

[英]PHP equivalent to Python's struct format

我正在尝试将Python代码编写为PHP。 但是我不能将PHP pack格式等同于Python pack格式

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

谢谢!

顺序如下:

!LLLL

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

NNNN

但是,最后的Q是有问题的。 它表示一个无符号的long long(64位)。 PHP的pack函数不提供无符号长整型(如果我错了,请纠正我)。

如果使用两个4字节无符号长整数(PHP中的NN格式)解压缩8字节无符号长整数,则可以将前一个长整数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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM