答案1
它归结为一个概念,叫做熵。 看维基百科。
基本思想是,如果存在一个压缩操作,可以总是使文件变小,那么逻辑表明,所述压缩操作能够将任何文件减少到 0 字节,同时仍保留所有数据。但这是荒诞,因为我们知道 0 个字节根本不能传达任何信息。所以我们刚才证明了不可能存在一种压缩算法,总是使其输入更小,因为如果是这样的话,任何信息都可以存储在 0 个字节中——但 0 个字节意味着缺席的信息,所以你不能同时拥有不信息与全部信息。因此,这是荒谬的。
由于这个理论概念,你使用过的每个压缩程序都将增加 的大小(或最好保持相同的大小)一些输入。也就是说,对于您设计或使用的任何压缩算法,都会有一些输入会变得更小,而有些则不会。
已压缩的数据通常不适合进一步压缩,因为大多数无损压缩算法都基于相同的理论原理。它是可以进一步压缩压缩效果较差的数据;但这比一开始就使用最佳可用算法对原始数据进行压缩效率较低。
例如,如果你有一个 100 MB 的文本文件,并使用常规 Zip 算法压缩它,它可能会压缩到 50 MB。如果你使用 LZMA2 压缩 Zip 文件,你可能会把它压缩到 40 或 45 MB,因为 LZMA 有一个更高的压缩比对于大多数可压缩数据,Zip 比 Zip 更能做到这一点。因此,它也可以压缩 Zip 数据,这是有道理的,因为 Zip 不会完全吸收其中的所有熵。但是,如果您完全消除 Zip 容器,则可以通过使用 LZMA2 压缩原始文本使其更小,可能会产生大约 30 - 35 MB 的大小(这些只是用来说明概念的“空气数字”)。
对于你试图压缩的二进制文件来说,它是更大因为 7-Zip 文件格式必须创建自己的内部结构并将已压缩的可执行文件的数据打包成 7-Zip 格式。其中包含字典、文件头等内容。这些额外的数据通常可以通过压缩数据本身节省的空间来抵消,但看起来您尝试压缩的可执行文件已经使用某种形式的 LZMA 压缩;否则,它可能会缩小可执行文件的大小或稍微增加它,而不是将其增加 2 MB(这已经很多了)。
答案2
7z 使用的底层压缩算法是无损。这意味着你可以多次迭代压缩和解压缩文件。此外,每次迭代后,文件将保持确切地相同。
不幸的是,你不能指望无损压缩算法可以多次应用,并且始终能得到积极的结果。它有一个严格的界限,不能越过。大致来说,这个界限取决于输入序列与随机数据的紧密程度。最重要的是,无损算法用于文件压缩、Internet HTML 数据传输、备份和其他要求输出文件解压为完全相同的原始输入文件的操作。
相反无损压缩后,您可能总是希望文件大小在压缩后减小有损(或有损)压缩算法。缺点是你不能确切地在一次压缩-解压缩迭代后恢复原始文件。这些算法最有名的是用于音频/视频/图像传输和存储。
bzip2,左心室舒张功能,LZMA2以及所使用的其他算法7z格式全部无损。因此,压缩会有一个限制,超过这个限制,压缩将无法进行。此外,可执行映像 (.exe) 通常是高度压缩的文件。7zip因为许多其他压缩工具嵌入了一些元数据,这实际上可以使输出文件更大。
脑筋急转弯:如果我们确实有一个可以始终减小文件大小的无损算法会怎么样?
在这种情况下,您将始终看到压缩文件小于输入文件。请参阅下面的评论以了解为什么这是不可能的。
答案3
如果原始可执行文件已被压缩(或包含高度压缩的数据或不可压缩的数据),则压缩它会增加其大小。
答案4
压缩的想法:
压缩软件会创建文件列表并消除重复内容。
压缩已压缩的文件时,压缩文件可能会比原始文件更大。