Python pack to PHP pack


Python pack to PHP pack

我正在尝试将Python脚本转换为PHP。但是,我在获取正确的格式方面遇到了麻烦。

Python:

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

3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe
PHP:

echo sha1(pack('L', 1));
输出:

3c585604e87f855973731fea83e21fab9392d2fc

谁能告诉我正确的方向,以获得两种语言相同的输出?

由于整数大小不同而产生差异。php版本的pack()中的L使用硬编码的32位整数,而Python默认使用机器整数大小。如果你在64位系统上工作,你会注意到其中的区别。(如问题所示)

你需要在python中使用=来标准化的对齐:

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

3c585604e87f855973731fea83e21fab9392d2fc

请参考本文档:

  • Python结构:https://docs.python.org/2/library/struct.html
  • PHP包:http://www.php.net/manual/en/function.pack.php

这似乎是32位vs 64位的问题。您正在运行64位版本的Python吗?

请注意,根据Python文档,L是一个"unsigned long"。由于您没有指定字节顺序、大小和对齐字符,Python将默认使用原生。在Linux上,这意味着64位的是8个字节,32位的是4个字节。

在处理二进制数据时,最好告诉Python你的确切意思:

  • <用于小端,标准尺寸或
  • >为大端,标准尺寸。

这将消除任何差异,这取决于您运行在什么类型的机器上。

这个例子表明您可能正在使用64位版本的python,如L == Q(64位)。

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