Python与Perl生成的二进制文件不一致,如何修改Python代码?
问题原因分析与解决方案
差异核心原因
1. id字段填充长度计算错误
Perl代码中,id写入后填充的是 32 - length($id) 个0字节(因为id的每个字符对应1个输出字节);而Python代码错误地使用了32 - len(id) // 2作为填充长度——实际上binascii.unhexlify(id_hex)的输出长度等于len(id)(ASCII编码下每个字符对应1字节),填充长度应为32 - len(id)。
2. kool/did/mode/gogo字段处理逻辑完全颠倒
- Perl中,这些变量是十六进制字符串:直接将每两个字符解析为一个字节(比如字符串"B2"会被转为字节
0xB2)。 - Python中却把它们当成普通字符串处理:先编码成字符的ASCII字节(比如"B2"编码为
0x42 0x32),再通过hexlify/unhexlify还原,和Perl的解析逻辑完全相反。
修改后的Python代码
修正填充长度,并调整kool等字段的处理逻辑,与Perl对齐:
import binascii # 处理id:和Perl逻辑一致,ASCII编码每个字符为对应字节 id_bytes = id.encode('ascii') # 处理其他字段:直接将十六进制字符串解析为字节 kool_bytes = binascii.unhexlify(kool) did_bytes = binascii.unhexlify(did) mode_bytes = binascii.unhexlify(mode) gogo_bytes = binascii.unhexlify(gogo) # 写入文件(with语句自动管理文件关闭) with open(filename, "wb") as file: file.write(id_bytes) # 修正填充长度:补满32字节 file.write(b"\x00" * (32 - len(id_bytes))) file.write(kool_bytes) file.write(did_bytes) file.write(mode_bytes) file.write(gogo_bytes)
额外注意事项
- Perl代码中
$did循环里的substr($di, ...)是笔误,实际应为$did,Python代码需确保变量名对应正确。 - 若
id包含非ASCII字符,需明确指定编码(如UTF-8)并保证Perl与Python使用相同编码规则。
内容的提问来源于stack exchange,提问作者FotisK
相关产品推荐
相关产品推荐

