在下面的代码中,我注意到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] }
1 回答
慕妹3146593
TA贡献1820条经验 获得超9个赞
非常非常简单,想象一下 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 10 0 "0" layers.pic
, 紧跟在索引之后,8x0, 8x50, 16x100" 并且它会更短。但是想象一下,如果一个文件只有0 17 39
; 那么“压缩”实际上是文件长度的两倍(1x0 1x17 1x39),并且您仍然需要浪费额外的空间来告诉索引它的原始名称是什么以及在哪里可以找到它。即使我们认为压缩不值得并按原样将文件存储到存档中,我们仍然会增加文件大小,因为我们需要在索引中放入一些内容。
(ZIP 存档比这更复杂一些;但基本原则非常接近 - 包括如果条目最终变大则不压缩的选项。)
编辑:如果您查看维基百科页面,您会发现每个文件条目都有至少 30 个字节加上文件名大小的标题;中央索引再次以扩展的形式重复该信息;然后是至少 20 个字节的 EOCD。您的文件以test.txt
8 个字节命名,因此仅元数据至少占用 (30+8) + (46+8) + 20 = 112 个字节,而没有压缩数据本身(因此最多占用 35 个字节)。
- 1 回答
- 0 关注
- 176 浏览
添加回答
举报
0/150
提交
取消