为什么 7zipped 文件比原始文件大?

IMB*_*IMB 37 compression zip 7-zip

可能的重复:
为什么 ZIP 压缩不压缩任何东西?

我尝试 7zipping 一个 .exe 文件,但它实际上变大了。

在此处输入图片说明

这是预期的结果吗?

all*_*tic 80

它归结为一个叫做entropy的概念。参见维基百科

基本思想是,如果存在总是可以使文件变小的压缩操作,那么逻辑规定所述压缩操作将能够将任何文件减少到 0 字节并仍然保留所有数据。但这是荒谬的,因为我们知道0字节根本不能传达任何信息。所以我们刚刚证明了不存在总是使输入更小的压缩算法,因为如果是这样的话,任何信息都可以存储在 0 字节中——但 0 字节意味着没有信息,所以你可以' t 同时拥有信息和所有信息。因此,这是荒谬的。

由于这个理论概念,您使用过的每个压缩程序都会增加某些输入 的大小(或最多保持相同大小)。也就是说,对于您设计或使用的任何压缩算法,都会有某些输入会变小,而有些则不会。

已压缩的数据通常不适合进一步压缩,因为大多数无损压缩算法都基于相同的理论原理。它能够进一步压缩性差压缩数据; 但这比从原始数据开始使用最佳可用算法简单地压缩它的效率要低。

例如,如果您有一个 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(很多)。

  • @jhocking:不,最重要的部分是中间:*“你使用过的每个压缩程序都会增加......一些输入的大小。”* 7zip 的文件格式有一个字典/文件头/等,但即使 7zip 使用的算法没有任何这些东西,我们仍然可以保证某些(实际上,大多数)输入的输出将与输入本身一样大或更大。这是信息论的基本事实,与文件头无关。 (6认同)
  • @Mehrdad 当然:只需编写一个始终返回原始输入的“压缩”算法。那里; 完毕。:P ...除此之外,不——任何压缩算法都将具有*一些*元数据,即使它只是文件开头的一位指示文件是否被压缩(0 == 未压缩,1 == 压缩)。如果您要修改文件*AT ALL* 的内容,则需要*一些* 元数据。而且,如果您要修改内容,就会使*某些* 输入更大。 (2认同)
  • @Mehrdad:*“是否有任何压缩算法(无论多么糟糕)都不会增加任何输入的长度?*” - 答案是否定的。有 2^(n+1)-1 个可能的 n 位或更小的消息。我们的算法必须将这些中的每一个映射到 **唯一** 输出。如果其中一个被映射到一个位数较少的值,则另一个值也必须映射到一个位数较多的值。 (2认同)

ole*_*sii 7

7z 中使用的底层压缩算法是无损的。这意味着您可以多次反复压缩-解压缩文件。此外,每次迭代后,文件将保持完全相同

不幸的是,您不能期望多次应用无损压缩算法并始终获得积极的结果。有一个严格的界限,它不能跳过。粗略地说,这个边界取决于输入序列与随机数据的紧密程度。最重要的是,无损算法用于文件压缩、Internet HTML 数据传输、备份和其他期望将输出文件解压缩为完全相同的原始输入文件的操作。

无损压缩相比,您可能总是期望在使用有损(或有损)压缩算法进行压缩后文件大小会减小。不利的一面是您无法在一次压缩-解压缩迭代后完全恢复原始文件。这些算法最著名的是音频/视频/图像传输和存储。

bzip2LZMALZMA27z格式使用的算法都是无损的。因此会有一个限制,之后它就不能再压缩了。最重要的是,可执行映像 (.exe) 通常是高度压缩的文件。7zip和许多其他压缩工具一样嵌入了一些元数据,这实际上可以使输出文件更大。

脑筋急转弯:如果我们确实有一个可以始终减小文件大小的无损算法会怎样?

在这种情况下,您将始终看到压缩文件小于输入文件。请参阅下面的评论,为什么这是不可能的。

  • 矛盾证明。**假设:** *假设始终可以使用无损算法压缩文件。* **Step1.** 单次压缩使输出文件至少小一位。如果是这样,经过多次迭代,我们最终将得到一个只有两位的文件。**第 2 步** 下一次迭代生成 1 位大小的文件。**步骤 3** 但是压缩算法是无损的,这意味着只允许一次有效的解压缩。显然,您无法从 1 个压缩位恢复 2 个原始位 - 您必须进行猜测。**最后一点违反了假设。** (5认同)

Pho*_*cUK 6

如果原始可执行文件已被压缩(或包含高度压缩的数据或不可压缩的数据),则压缩它会增加大小。