假设我有一个像这样的。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
所以一个较大的文件被压缩成一个较小的文件。我可以提供两种解释:
- 当输入具有低熵时,压缩工作。尝试压缩180字节的随机数据,压缩的大小将比您最好的测试用例还要大。前置二进制数据意味着压缩器必须同时处理二进制数据和文本。引入了在文本中根本不存在的新字节值。这增加了文件的熵。
- 所有压缩都有弱点和长处(除了完美的"Kolmogorov"压缩)。您可能会看到由某些实现细节引起的异常。毕竟差别不大。