Answers:
它归结为一个叫做熵的概念。参见维基百科。
基本思想是,如果存在始终可以使文件变小的压缩操作,则逻辑指示所述压缩操作将能够将任何文件减少为0字节,并且仍然保留所有数据。但这是荒谬的,因为我们知道0字节根本无法传达任何信息。因此,我们刚刚证明了不存在一种压缩算法,该压缩算法总是会使输入变小,因为在这种情况下,任何信息都可以存储在0字节中,但是0字节表示没有信息,因此您可以同时没有信息和所有信息。因此,这是荒谬的。
由于这个理论上的概念,您使用的每个压缩程序都会增加某些输入 的大小(或者最好保持相同的大小)。也就是说,对于您设计或使用的任何压缩算法,都会有一些输入变小,而有些则不会。
由于大多数无损压缩算法都基于相同的理论原理,因此已经压缩的数据通常是进一步压缩的可怕选择。它是能够进一步压缩性差压缩数据; 但这要比简单地使用最佳算法从原始数据开始压缩来效率低。
例如,如果您有一个100 MB的文本文件,并使用常规的Zip算法对其进行压缩,则可能会将其压缩到50 MB。如果随后使用LZMA2压缩Zip文件,则可能会将其压缩到40或45 MB,因为LZMA 对大多数可压缩数据的压缩率比Zip高。因此,有理由认为它也可以压缩Zip数据,因为Zip不会完全吸收所有熵。但是,如果您完全消除了Zip容器,则可以通过使用LZMA2压缩原始文本来缩小它的大小,从而可能产生大约30-35 MB的大小(这些只是“空中数字”,以说明这一概念) 。
对于要压缩的二进制文件,它会更大,因为7-Zip文件格式必须创建自己的内部结构,并将已经压缩的可执行文件的数据打包为7-Zip格式。它包含字典,文件头等内容。这些额外的数据通常可以通过压缩数据本身而节省下来,但是看起来您要压缩的可执行文件已经使用某种形式的LZMA进行了压缩。否则,它可能会缩小可执行文件的大小或将其稍微增加一点,而不是将其增加2 MB(这是很大的)。
2^(n+1)-1
大小为n位或更少的可能消息。我们的算法必须将每个映射到唯一的输出。如果其中的一个甚至映射到一个位数更少的值,则另一个值也必须映射到一个位数更多的值。
7z中使用的基础压缩算法是无损的。这意味着您可以迭代地多次压缩/解压缩文件。此外,每次迭代后,文件将保持完全相同。
不幸的是,您不能期望无损压缩算法被多次应用并始终获得肯定的结果。有一个严格的界限,它不能越过。大致而言,该边界取决于输入序列与随机数据的融合程度。最重要的是,无损算法用于文件压缩,Internet HTML数据传输,备份和其他期望将输出文件解压缩为完全相同的原始输入文件的操作。
与无损压缩相比,您可能总是希望使用有损(或有损)压缩算法在压缩后减小文件大小。不利的一面是,您无法在一次压缩/解压缩迭代之后完全恢复原始文件。这些算法在音频/视频/图像传输和存储方面最为著名。
7z格式使用的bzip2,LZMA,LZMA2和其他算法都是无损的。因此,将有一个限制,在该限制之后它将无法再压缩。最重要的是,可执行映像(.exe)通常是高度压缩的文件。7zip和许多其他压缩工具一样,会嵌入一些元数据,实际上这会使输出文件变大。
在这种情况下,您将始终看到压缩文件小于输入文件。看到下面的评论为什么它不可能。