亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么壓縮字節比字節大?

為什么壓縮字節比字節大?

C#
一只甜甜圈 2021-11-21 14:39:38
在下面的代碼中,我注意到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.txt8 個字節命名,因此僅元數據至少占用 (30+8) + (46+8) + 20 = 112 個字節,而沒有壓縮數據本身(因此最多占用 35 個字節)。


查看完整回答
反對 回復 2021-11-21
  • 1 回答
  • 0 關注
  • 205 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號