我在一个目录中递归地压缩了一个文件。但是我注意到最后几个 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 时会发生这种情况?
正如评论中提到的,SO问题几乎涵盖了这一点。现在,我想试验一下这种通货紧缩的实际运作方式。所以,我做了以下测试。
什么是熵?
熵是信息流不可预测性的度量。完全一致的比特流(全为零或全为 1)是完全可预测的(没有熵)。完全不可预测的比特流具有最大熵。信息熵的想法归功于克劳德香农,他给出了一个公式来表达它。
现在,我用y
或n
如下创建了一个文件。
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)
现在,在上面的命令中,我们有可预测的字节y
,n
这就是为什么我们的压缩百分比为 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
归档时间: |
|
查看次数: |
2236 次 |
最近记录: |