为什么Zlib压缩在字符串与二进制数据上更好?

时间:2013-01-15 11:05:37

标签: compression zlib

说我有一个像这样的.txt文件:

11111111111111Hello and welcome to stackoverflow. stackoverflow will hopefully provide me with answers to answers i do not know. Hello and goodbye.11111111111111

然后我将创建一个等效的二进制形式(.bin文件):

Stream.Write(intBytes, 0, intBytes.Length); // 11111111111111
Stream.Write(junkText, 0, junkText.Length); // Hello and welcome to stackoverflow...
Stream.Write(intBytes, 0, intBytes.Length); // 11111111111111

第一个例子压缩比第二个好。如果我删除11111111111111,他们压缩到相同的大小。但是拥有11111意味着.txt版本可以更好地压缩。

byte[] intBytes = BitConverter.GetBytes(11111111111111); // This is 8 bytes
byte[] strBytes = UTF8Encoding.UTF8.GetBytes("11111111111111"); // This is 14 bytes

这是使用本机C ++ Zlib库。

在压缩之前,.bin文件的大小较小,我期待这一点。

为什么压缩后.txt版本的尺寸较小?它似乎压缩比bin等效物更好。

bin文件: 未压缩尺寸:2448 压缩尺寸:177

txt文件: 未压缩尺寸:2460 压缩尺寸:167

1 个答案:

答案 0 :(得分:2)

因此,较大的文件会压缩为较小的文件。我可以提供两种解释:

  1. 当输入具有低熵时,压缩起作用。尝试压缩180字节的随机数据,压缩的大小甚至会大于测试用例的最佳值。预先添加二进制文件意味着压缩器必须同时处理二进制数据和文本。引入了新的字节值,这些值在文本中根本不会发生。这会增加文件的熵。
  2. 所有压缩都有弱点和强点(完美的“Kolmogorov”压缩除外)。您可能会看到某些实现细节导致的异常。毕竟差别并不大。