You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:45:30