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

Compression 压缩和解压缩相同的文件会产生不同的大小,compression,zip,Compression,Zip,下面就是发生的事情。。我从我的一个朋友那里收到了一个压缩的zip文件 此文件包含以下元信息 1518852 Nov 19 15:10 friend.zip 32e44a2d0283d81629dcf749fc3ced83c47efd7b firend.zip 然后我解开了这个文件,不碰它,它满足了,甚至不读它!我把它再拉一次,它就会产生这个 1519608 Nov 19 15:31 mine.zip 0aaea14e59971c40ba1de04558e44b211ac4c628 min

下面就是发生的事情。。我从我的一个朋友那里收到了一个压缩的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 我用我的笔记本电脑,pc和minimac!它们都产生相同的价值观!相同不同的包大小756字节!同样的金额。。这快把我逼疯了!我没有碰这些文件!甚至连cat file.txt都没有!没什么

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

这是一个javascript应用程序!没有什么是纯文本编译的。。只有这个file.DS_存储是一个二进制文件,我不知道它代表什么

我应该提到的是,在windows上进行压缩和解压缩时,我打开了这两个文件,但它们都是压缩的,而且每件事都会产生相同的CRC

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

这是什么?这怎么会发生


.zip文件,可以签名吗?我的意思是,如果它们被某个特殊的参数所签名,这会对压缩和解压缩产生影响吗

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

为了阐明我所说的“隐藏参数”的含义:将压缩算法想象成一个程序函数。许多变量必须设置为初始值。对于其中一些,根据预期的输入、压缩级别等,多个值是有意义的。。。即使压缩“级别”也是一个模糊的东西——用户希望指定一个介于1和9之间的数字——但在内部,有许多开关必须相应地设置,并且在一定程度上可以自由地将“级别”映射到实际的初始化值。实现该算法的一个程序员可能会做一些与另一个稍有不同的事情,因为两者都被认为是“正确”的,因为您可以使用任何一个程序进行压缩和解压缩;它们只是不能产生完全相同的输出大小

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


通过这种方式,签名确保没有更改任何文件,包括ToC,并且ToC确保没有添加或删除任何文件。

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

为了阐明我所说的“隐藏参数”的含义:将压缩算法想象成一个程序函数。许多变量必须设置为初始值。对于其中一些,根据预期的输入、压缩级别等,多个值是有意义的。。。即使压缩“级别”也是一个模糊的东西——用户希望指定一个介于1和9之间的数字——但在内部,有许多开关必须相应地设置,并且在一定程度上可以自由地将“级别”映射到实际的初始化值。实现该算法的一个程序员可能会做一些与另一个稍有不同的事情,因为两者都被认为是“正确”的,因为您可以使用任何一个程序进行压缩和解压缩;它们只是不能产生完全相同的输出大小

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


通过这种方式,签名确保没有更改任何文件,包括ToC,并且ToC确保没有添加或删除任何文件。

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

为了阐明我所说的“隐藏参数”的含义:将压缩算法想象成一个程序函数。许多变量必须设置为初始值。对于其中一些,根据预期的输入、压缩级别等,多个值是有意义的。。。即使压缩“级别”也是一个模糊的东西——用户希望指定一个介于1和9之间的数字——但在内部,有许多开关必须相应地设置,并且在一定程度上可以自由地将“级别”映射到实际的初始化值。一个实现算法的程序员可能会做一些