关于压缩:压缩和解压缩相同的文件会产生不同的大小

Compressing and Decompressing same files produces different size

这正是发生的事情 .. 我从我的一个朋友那里收到了一个压缩的 zip 文件
此文件具有以下元信息

1
2
1518852 Nov 19 15:10 friend.zip  
32e44a2d0283d81629dcf749fc3ced83c47efd7b firend.zip

然后我解压缩了这个文件,不碰它甚至不读它就满足了!我再次压缩它,它会产生这个

1
2
1519608 Nov 19 15:31 mine.zip
0aaea14e59971c40ba1de04558e44b211ac4c628  mine.zip

我在 linux、windows、mac 上试过这个。在不同的机器上而不是虚拟机上,在不同的架构上,amd 和 intel
我用我的笔记本电脑、个人电脑和 minimac !它们都产生相同的值!包大小相同不同 756 字节!同样的sha1 sum ..这让我发疯了!我没有碰文件!根本就没有 cat file.txt !没有什么 !

这些是文件的内容
app code.txt config.xml .DS_Store 图片 index.html .settings widget.info

这是一个 javascript 应用程序!没有任何东西被编译只是纯文本..只有这个文件 .DS_Store 是一个二进制文件,我不知道它代表什么!

我应该提到这个文件在 Windows 上的压缩和解压缩过程中我打开了这两个文件,同时它们都被压缩了,每件事都会产生相同的 CRC ..

文件之间只有一件事是不同的,它是一个名为 PACKED 的字段
.DS_Store 在原始 zip 文件中的值似乎为 15,而在我的文件中的值为 13!

这是什么?怎么会这样?

.zip 文件,可以签名吗?我的意思是,如果它们由某些特殊参数签名,那么压缩和解压缩会有所不同吗?


大多数现实世界的压缩算法不会确定性地压缩到特定大小,除非您确保算法的所有参数和所有实现细节完全相同。请注意,这可能包括您不能作为程序用户设置的隐藏参数。

澄清我所说的"隐藏参数"是什么意思:想象一下压缩算法就像一个程序函数。许多变量必须设置为初始值。对于其中一些,多个值是有意义的,具体取决于预期的输入、压缩级别……甚至压缩"级别"也是一个模糊的东西——用户希望指定一个介于 1 和 9 之间的数字-- 但是在内部有很多开关必须相应地设置,并且有一定程度的自由度如何将"级别"映射到实际的初始化值。一个实现该算法的程序员可能会做一些与另一个不同的事情,因为两者都被认为是"正确的",因为您可以使用任何一个程序进行压缩和解压缩;他们只是不产生完全相同的输出大小。

关于签署 zip 文件的问题:您能详细描述一下您要完成的工作吗?这听起来有点像您想要确保文件的完整性......但我怀疑您实际上想要确保 zipfile 内容的完整性。这就是你的答案:生成一个"目录",然后生成包括 ToC 在内的内容签名并添加它。 (无论 ToC 是否包含自身和/或签名无关紧要,只需在所有系统上以相同方式执行即可)

这样,签名确保没有文件被更改,包括 ToC,并且 ToC 确保没有文件被添加或删除。


输出取决于压缩算法设置。在存档器中,您通常可以设置许多参数,如压缩级别、压缩/解压缩文件的资源量等。详情请参阅规范。