将UTF-8(或其他8位编码)压缩为7位或更少位

时间:2009-12-03 04:43:06

标签: python c utf-8 compression

我希望以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等

但是,我对一些事情并不完全确定。

  1. 这足以实际缩短文件大小吗?我有一种不好的感觉,这只会在二进制字符串上留下额外的0 - 11011001可能会映射到01000001而不是1000001,我实际上不会节省空间。 如果发生这种情况,我该如何摆脱零?
  2. 如何打开文件以二进制/十进制/十六进制读/写而不仅仅是文本? 我主要使用Python,但如果必须的话,我可以混淆C.
  3. 谢谢。

6 个答案:

答案 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的用途。