压缩时 Zip 不压缩文件

rye*_*ayo 2 zip compression

我在一个目录中递归地压缩了一个文件。但是我注意到最后几个 zip 文件没有被压缩。

  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042406.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042279.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042466.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042200.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042227.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042372.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042245.dcm (deflated 0%)
  adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042282.dcm (deflated 0%)
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么在使用 zip 时会发生这种情况?

Ram*_*esh 7

正如评论中提到的,SO问题几乎涵盖了这一点。现在,我想试验一下这种通货紧缩的实际运作方式。所以,我做了以下测试。

什么是熵?

是信息流不可预测性的度量。完全一致的比特流(全为零或全为 1)是完全可预测的(没有熵)。完全不可预测的比特流具有最大熵。信息熵的想法归功于克劳德香农,他给出了一个公式来表达它。

现在,我用yn如下创建了一个文件。

perl -e 'my $y; $y .= int(rand(100))>90 ? "y" : "n" for (0..999); print $y;' > f1
Run Code Online (Sandbox Code Playgroud)

现在,我运行了命令,zip f1.zip f1得到的输出为,

zip f1.zip f1
  adding: f1 (deflated 89%)
Run Code Online (Sandbox Code Playgroud)

现在,在上面的命令中,我们有可预测的字节yn这就是为什么我们的压缩百分比为 89。

现在,我正在进行如下实验。

 dd if=/dev/urandom of=./f2 bs=1M count=1
Run Code Online (Sandbox Code Playgroud)

如果我执行命令zip f2.zip f2,这就是我得到的输出。

zip f2.zip f2
  adding: f2 (deflated 0%)
Run Code Online (Sandbox Code Playgroud)

由于/dev/urandom完全不可预测,我们得到的通货紧缩率为 0%。我在下面提供的参考链接对如何计算可预测字节的熵有很好的解释。

此外,还有这个工具ent可以在基于 debian 的系统中计算文件的熵。你可以做一个apt get install ent并计算熵率ent filename并找出真正发生的事情。

您可以从此处阅读有关此命令的信息。

参考

http://troydhanson.github.io/misc/Entropy.html