Python打包到PHP打包

2 投票
2 回答
1124 浏览
提问于 2025-04-18 05:46

我正在尝试把一个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

请参考以下文档:

撰写回答