为什么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

第一个示例比第二个示例压缩得更好。如果我删除1111111111111111,它们压缩到相同的大小。但是拥有11111's意味着。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压缩得更好。

本文件:未压缩的大小:2448压缩大小:177

txt文件:未压缩的大小:2460压缩大小:167

所以一个较大的文件被压缩成一个较小的文件。我可以提供两种解释:

  1. 当输入具有低熵时,压缩工作。尝试压缩180字节的随机数据,压缩的大小将比您最好的测试用例还要大。前置二进制数据意味着压缩器必须同时处理二进制数据和文本。引入了在文本中根本不存在的新字节值。这增加了文件的熵。
  2. 所有压缩都有弱点和长处(除了完美的"Kolmogorov"压缩)。您可能会看到由某些实现细节引起的异常。毕竟差别不大。

最新更新