Python3.4使用struct模块生成指定二进制文件失败求助
解决二进制文件打包匹配指定Hex Dump的问题
我来帮你分析一下问题所在,并且给出对应的解决方案:
首先,我们得先搞懂你提供的Hex Dump格式:默认的hexdump命令会把数据按16位大端分组显示,而你的64位RHEL系统是小端字节序,struct.pack('I', x)会生成小端的4字节无符号整数。这两者的匹配是关键。
你的目标字节序列分析
你需要的最后4字节在Hex Dump中显示为ccf8 0001,对应实际的小端字节序列是0xf8, 0xcc, 0x01, 0x00,把这个字节序列转换成小端无符号整数的话,计算结果是0x0001ccf8 = 118008——这才是你需要打包的数值,而不是你之前尝试的14500。
正确的代码实现
#!/usr/bin/python3.4 import struct with open('brian', 'wb') as fout: # 打包前三个整数,和你之前的逻辑一致(小端字节序) fout.write(struct.pack('I', 0)) fout.write(struct.pack('I', 4)) fout.write(struct.pack('I', 180)) # 打包对应dump结果ccf8 0001的整数 fout.write(struct.pack('I', 118008))
为什么之前的尝试失败?
- 打包整数14500:14500的十六进制是
0x3839,小端字节序列是0x39, 0x38, 0x00, 0x00,对应的Hex Dump会显示为3839 0000,和你需要的ccf8 0001完全不符。 - 打包字符串
b'014500':struct.pack('4s', ...)会取字符串前4个字符b'0145',对应的ASCII字节是0x30, 0x31, 0x34, 0x35,Hex Dump会显示为3130 3534,同样不符合要求。
补充说明
如果你的“014500”是用来表示01时45分00秒,那可能是需求中的数值转换规则有误解(比如特殊的编码、时间戳偏移等),但如果只是要严格复现你给出的Hex Dump结果,打包整数118008就可以完全匹配。
内容的提问来源于stack exchange,提问作者wxman73
相关产品推荐
相关产品推荐

