[英]Python pack to PHP pack
我正在尝试将Python脚本转换为PHP。 但是我无法正确设置格式。
蟒蛇:
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
请参考此文档:
这似乎是32位和64位问题。 您是否正在运行64位版本的Python?
请注意,根据Python文档 , L
是“无符号长”。 由于您未指定字节顺序,大小和对齐字符,因此Python将默认为native 。 在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.