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

时间:2013-11-19 13:51:57

标签: compression zip

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

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

然后我解开了这个文件,没有触及它的内容甚至没有阅读它!然后我再拉链它就产生了这个

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

我在linux,windows,mac ..上试过这个,在不同的机器上,而不是虚拟机和不同的架构,amd和intel 我用过我的笔记本电脑,电脑和迷你世界!它们都产生相同的价值!包装尺寸相同不同756字节!同样的sha1总和..这让我疯了!我没有触摸文件!在所有甚至没有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文件,他们可以签名吗?我的意思是,如果他们是由一些特殊的参数签署,那会对压缩和减压产生影响吗?

2 个答案:

答案 0 :(得分:1)

大多数实际压缩算法都没有确定性地压缩到特定大小,除非您确保 all 算法的参数和所有实现细节完全是相同。请注意,这可能包含您无法设置为程序用户的隐藏参数。

澄清“隐藏参数”的含义:想象一下压缩算法就像程序函数一样。必须将许多变量设置为初始值。对于其中一些,根据预期的输入,压缩级别,不止一个值是有意义的......甚至压缩“级别”也是一个模糊的东西 - 用户希望指定一个介于1和9之间的数字 - 但在内部有许多必须相应设置的开关,并且“水平”如何映射到实际初始化值有一定的自由度。一个实现算法的程序员可能会做一些与另一个不同的程序员,因为两者都被认为是“正确的”,因为你可以用任何一个程序压缩和解压缩;它们只是不会产生完全相同的输出大小。

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

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

答案 1 :(得分:0)

输出取决于压缩算法设置。在归档程序中,通常可以设置许多参数,如压缩级别,压缩/解压缩文件的资源量等。有关详细信息,请参阅the specification