为什么压缩字节大于字节?

  • 本文关键字:字节 大于 压缩 c# file
  • 更新时间 :
  • 英文 :


在下面的代码中,我注意到compressedBytes值是147,大于bytes100。

我认为compressedBytes应该更少。请说明为什么?

byte[] compressedBytes;
byte[] bytes = File.ReadAllBytes(filename); //byte[100]
using (var outStream = new MemoryStream())
{
using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
{
var fileInArchive = archive.CreateEntry("test.txt", CompressionLevel.Optimal);
using (var entryStream = fileInArchive.Open())
using (var fileToCompressStream = File.Open(filename, FileMode.Open))
{
var X = fileToCompressStream.Length; //100
fileToCompressStream.CopyTo(entryStream);
}
}
compressedBytes = outStream.ToArray(); //byte[147]
}

非常非常简化,想象一下ZIP文件的工作原理是这样的:

  • 有一个索引,其中说明了它包含哪些文件名以及我们可以在哪里找到它们
  • 它通过说每个字节重复多少次来压缩每个文件
因此,如果您有一个文件layers.pic

包含:0 0 0 0 0 0 0 0 50 50 50 50 50 50 50 50 100 100 100 100 100 100 100 100 100 100 100 100 100 100100 10layers.pic0 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100但是想象一下,如果一个文件只有0 17 39;那么"压缩"实际上是文件的两倍(1x0 1x17 1x39(,你仍然需要浪费额外的空间告诉索引它的原始名称是什么以及在哪里可以找到它。即使我们认为压缩不值得并将文件按原样存储到存档中,我们仍然会增加文件大小,因为我们需要在索引中放置一些内容。

(ZIP 存档比这复杂一些;但基本原则非常接近 - 包括如果条目最终会变大,则不压缩的选项。

编辑:如果你查看维基百科页面,你会发现每个文件条目都有一个至少30字节的标题加上文件名大小;中央索引以扩展的形式再次重复该信息;然后是EOCD,至少是20字节。您的文件被命名为 8 个字节的test.txt,因此只有元数据至少占用 (30+8( + (46+8( + 20 = 112 字节,而没有压缩数据本身(因此最多占用 35 个字节(。

最新更新