Python生成含唯一数据的Hex文件时文件大小异常问题
生成指定大小Hex文件的问题解决
你的问题情况
你本来想生成一个1MB大小的Hex文件,内容是从1到1<<20(也就是1048576)的十六进制等效值,但实际输出的文件却有6.9MB。你试着把文件打开模式从'wb'改成'w',结果文件大小压根没变化。
你用的代码是这样的:
f=open('/tmp/hex_data','wb') for i in xrange(1<<20): f.write(hex(i)) f.close()
执行ls命令得到的结果:
$ ls -lrth hex_data -rw-r--r-- 1 aameershaikh wheel 6.9M Apr 5 16:43 hex_data
为啥会这样?
咱们来拆解一下问题:你用的hex()函数返回的是字符串形式的十六进制值,比如hex(10)会返回'0xa',hex(255)返回'0xff',每个这样的字符串长度都不一样,而且每个字符都是ASCII码(占1字节)。
举个直观的例子:
- 0到15的十六进制是
0x0到0xf,每个字符串占3字节 - 16到255是
0x10到0xff,每个占4字节 - 更大的数字比如
0x10000(65536)会返回'0x10000',占6字节
这么累加下来,总字节数肯定远远超过1MB(1048576字节),文件变成6.9MB也就不奇怪了。至于改'wb'为'w',这俩的区别只是是否按二进制模式写入,但你写入的本来就是字符串,所以完全不会影响文件大小。
该怎么解决?
要生成刚好1MB的文件,你需要写入的是二进制形式的十六进制数据(也就是字节),而不是字符串。因为1MB正好是1048576字节,所以咱们可以把每个数字转换成单字节的二进制值(超过255的数字会自动截断低8位,如果你需要完整存储更大的数字,那文件大小就会超过1MB,得调整预期)。
这里用Python的struct模块来打包数据是最方便的,给你写个可行的代码:
import struct # 用with语句自动管理文件,比手动close更安全 with open('/tmp/hex_data', 'wb') as f: # 从1循环到1<<20(包含1048576) for i in xrange(1, (1 << 20) + 1): # 把i打包成无符号单字节(B代表unsigned char) f.write(struct.pack('B', i))
如果你的需求是每个数字用固定长度的多字节存储(比如4字节的32位整数),那文件大小会是4MB,这时候就得调整你的预期大小了。但如果就是要1MB,上面的代码就能满足——每个数字对应1字节,1048576个数字正好凑成1MB。
内容的提问来源于stack exchange,提问作者Aamir Shaikh
相关产品推荐
相关产品推荐

