Python包到PHP包

Python包到PHP包,php,python,struct,pack,unpack,Php,Python,Struct,Pack,Unpack,我正在尝试将Python脚本转换为PHP。然而,我有麻烦得到正确的格式 Python: 打印(hashlib.sha1(struct.pack('L',1)).hexdigest()) 输出: 3c585604e87f855973731fea83e21fab9392d2fc 3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe PHP: echo-sha1(pack('L',1)); 输出: 3c585604e87f855973731fea83e21fab93

我正在尝试将Python脚本转换为PHP。然而,我有麻烦得到正确的格式

Python:

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

3c585604e87f855973731fea83e21fab9392d2fc
3da89ee273be13437e7ecf760f3fbd4dc0e8d1fe
PHP:

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

3c585604e87f855973731fea83e21fab9392d2fc
3c585604e87f855973731fea83e21fab9392d2fc

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

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

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

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

3c585604e87f855973731fea83e21fab9392d2fc
请参阅本文件:

  • Python结构:
  • PHP包:

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

注意,根据L是一个“无符号长”。由于没有指定字符,Python将默认为本机。在Linux上,这意味着64位上有8个字节,32位上有4个字节

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

  • 用于大端,标准尺寸
这将消除任何差异,具体取决于您运行的机器类型

此示例显示您可能正在使用64位python构建,如
L
==
Q
(64位)


打印(hashlib.sha1(struct.pack)('正确的方向是将PHP转换为Python。我当然喜欢!