Python包到PHP包

时间:2014-05-08 03:45:04

标签: php python struct pack unpack

我正在尝试将Python脚本转换为PHP。但是我无法正确获取格式。

的Python:

print(hashlib.sha1(struct.pack('L', 1)).hexdigest()) 

输出:

3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe

PHP:

echo sha1(pack('L', 1));

输出:

3c585604e87f855973731fea83e21fab9392d2fc

有人可以指出我正确的方向,以两种语言获得相同的输出吗?

2 个答案:

答案 0 :(得分:3)

由于不同的整数大小,会出现差异。虽然php(version)版本中的L使用硬编码的32位整数,但Python默认使用机器整数大小。如果您正在使用64位系统,您会发现其中的差异。 (如问题所示)

您需要使用python中的=来标准化的大小:

print(hashlib.sha1(struct.pack('=L', 1)).hexdigest())

输出:

3c585604e87f855973731fea83e21fab9392d2fc

请参阅此文档:

答案 1 :(得分:2)

这似乎是一个32对64位的问题。你在运行64位版本的Python吗?

请注意,根据Python docsL是“无符号长”。由于您没有指定byte order, size and alignment字符,因此Python将默认为 native 。在Linux上,这意味着64位上有8个字节,32位上是4个字节。

最好告诉Python使用二进制数据时的意思:

  • <适用于小端,标准尺寸或
  • >适用于big-endian,标准尺寸。

这将消除任何差异,具体取决于您正在运行的机器类型。

此示例显示您可能使用64位版本的python,L == Q(64位)。

>>> print(hashlib.sha1(struct.pack('<I', 1)).hexdigest())
3c585604e87f855973731fea83e21fab9392d2fc

>>> print(hashlib.sha1(struct.pack('<Q', 1)).hexdigest())
3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe