3

假设我有一个这样的 .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

4

1 回答 1

2

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

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