如何按字(非字节)将十六进制写入二进制文件?代码报错求助
解答:按字写入十六进制到二进制文件及溢出错误修复
问题1:如何按字(而非字节)将十六进制写入二进制文件?
通常我们说的“字”指16位无符号整数,对应2字节的二进制数据。要实现这个,步骤很清晰:
- 把十六进制值转成Python整数(比如
0xffff直接等价于十进制65535) - 使用
int.to_bytes()方法将整数转换为2字节的字节串,指定字节序(大端big或小端little)和无符号类型 - 以二进制写入模式(
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
相关产品推荐
相关产品推荐

