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

如何按字(非字节)将十六进制写入二进制文件?代码报错求助

解答:按字写入十六进制到二进制文件及溢出错误修复

问题1:如何按字(而非字节)将十六进制写入二进制文件?

通常我们说的“字”指16位无符号整数,对应2字节的二进制数据。要实现这个,步骤很清晰:

  1. 把十六进制值转成Python整数(比如0xffff直接等价于十进制65535)
  2. 使用int.to_bytes()方法将整数转换为2字节的字节串,指定字节序(大端big或小端little)和无符号类型
  3. 以二进制写入模式(wb)打开文件,写入转换后的字节串

举个实际例子,把0xffff写入文件后用hexdump -C查看:

# 将十六进制字写入二进制文件
hex_word = 0xffff
with open("word_dump.bin", "wb") as f:
    # 按2字节大端序写入(符合多数二进制文件的存储习惯)
    f.write(hex_word.to_bytes(2, byteorder='big', signed=False))

执行后运行hexdump -C word_dump.bin,输出会是:

00000000  ff ff                                             |..|
00000002

如果需要统一把所有数据都按字(2字节)写入(哪怕数值小于256也补前导0),直接固定to_bytes(2, ...)即可,比如数值3会被写成0x0003,对应字节串b'\x00\x03'。


问题2:解决代码中的OverflowError异常

你的代码触发错误的核心原因很明确:byte.to_bytes(1, byteorder='big')强制把所有整数转成1字节(单字节的取值范围是0-255),但123041远超出这个范围,自然会抛出溢出异常。这里给你两个适配不同场景的修复方案:

修复方案1:自动适配数值的字节长度

如果你的列表里混合了不同大小的整数(单字节、字、甚至更长的多字节数据),可以让代码自动计算每个数值需要的最小字节数:

newFileBytes = [123041, 3, 255, 0, 100]
# 用with语句自动管理文件,避免手动关闭遗漏
with open("f.bin", "wb") as newFile:
    for value in newFileBytes:
        # 计算无符号整数所需的最小字节数
        byte_length = (value.bit_length() + 7) // 8
        # 处理0的特殊情况,确保至少占用1字节
        byte_length = max(byte_length, 1)
        # 按大端序写入无符号数据
        newFile.write(value.to_bytes(byte_length, byteorder='big', signed=False))

修复方案2:统一按字(2字节)写入(适用于16位以内的数据)

如果确认所有数值都在16位无符号范围(0-65535)内,可以统一指定2字节转换:

# 注意:123041超出16位范围,需调整数值或改用方案1
newFileBytes = [65535, 3, 255, 0, 100]
with open("f.bin", "wb") as newFile:
    for value in newFileBytes:
        newFile.write(value.to_bytes(2, byteorder='big', signed=False))

如果必须写入123041这类超出16位的数值,需要指定更大的字节数(比如3字节),但这就不属于“字”的范畴了,而是更长的多字节数据。


内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:45