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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:01:14