Python打包到PHP打包
我正在尝试把一个Python脚本转换成PHP。不过我在格式上遇到了一些麻烦。
Python代码:
print(hashlib.sha1(struct.pack('L', 1)).hexdigest())
输出结果:
3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe
PHP代码:
echo sha1(pack('L', 1));
输出结果:
3c585604e87f855973731fea83e21fab9392d2fc
有没有人能帮我指点一下,怎么才能在这两种语言中得到相同的输出结果呢?
2 个回答
2
这看起来是32位和64位之间的问题。你在用64位的Python吗?
根据Python文档,L
代表“无符号长整型”。因为你没有指定字节顺序、大小和对齐的字符,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
3
这个差异是因为整数的大小不同。在PHP的pack()函数中,L
使用的是固定的32位整数,而Python默认使用的是机器的整数大小。如果你在一个64位的系统上工作,你会注意到这个差别。(就像问题中提到的那样)
在Python中,你需要使用=
来标准化对齐方式和大小:
print(hashlib.sha1(struct.pack('=L', 1)).hexdigest())
输出结果:
3c585604e87f855973731fea83e21fab9392d2fc
请参考以下文档: