我希望以UTF-8编码的文件不使用超过128个不同的字符,然后将其移动到7位编码以节省1/8的空间。例如,如果我有一个只使用前128个(ascii)字符的16 MB文本文件,我想削掉额外的位以将文件减少到14MB。
我将如何做到这一点?
似乎没有现成的免费或专有程序,所以我想我可能会尝试制作一个简单(如果效率低下)的程序。
我的基本思想是从用于每个字符的当前十六进制/十进制/二进制值到七位编码中的128个值创建函数,然后扫描文件并将每个修改后的值写入一个新文件。
所以,如果文件看起来像(我将使用小数示例,因为我尽量不用十六进制思考)
127 254 025 212 015 015 132 ... 它会成为
001 002 003 004 005 005 006
如果127映射到001,254映射到005等
但是,我对一些事情并不完全确定。谢谢。
答案 0 :(得分:18)
只需使用gzip压缩,省力60-70%,省力0%!
答案 1 :(得分:6)
您是否理解文件被分成字节?因此,如果你这样做,你将有7位字节1的第一个字母加上第二个字母的1位,然后在第二个字母中,你有第二个字母的6位,以及2位的第三,等等。它看起来像这样:
|AAAAAAAB|BBBBBBCC|CCCCCDDD|DDDDEEEE|EEEFFFFF|FF...
\------/ \------/ \------/ \------/ \------/
byte byte byte byte byte
答案 2 :(得分:3)
你的想法是正确的,但需要一些发展。如果您对此类数据压缩感兴趣,可以调查Huffman coding。这是一种简单的数据压缩技术,可用于许多实际情况。
我可以推荐Mark Nelson的The Data Compression Book,这是对数据压缩技术的一个很好的介绍。
答案 3 :(得分:1)
你的想法不太可行。如果将字节0x05写入文件,则写入字节,所有8位 - 带前导零。要实际完成您所需要的,您可以用7个字节对每个8字节进行编码(因为您只需要8 * 7位来编码8个值)。一种方法是将7个值保存在其字节的7个低位中,并将第8个字节扩展到7个MS位上。
对于Python,以二进制写入模式打开文件是open(filename, 'wb')
。您还必须了解如上所述的打包字节的位操作。
只是一个小例子:
>>> a = 0x03
>>> b = 0x59
>>> c = ((a & 0x1) << 7) | b
>>> hex(c)
'0xd9'
>>>
这会将a
的最低位置于c
的MSBit中,c
的其余部分为b
的值。
我相信你可以从这里拿走它。
答案 4 :(得分:0)
“这只会在二进制字符串上留下额外的0 - 11011001可能会映射到01000001而不是1000001,我实际上不会节省空间。”
正确。你的计划什么都不做。
答案 5 :(得分:-2)
您需要的是UTF-7。
编辑: UTF-7的优点是“仅”特殊字符膨胀,因此如果输入中的特殊字符很少,则只需将UTF-8转换为7即可获得更少的字节数位。这就是UTF-7的用途。