一尘不染

如何计算文件的熵?

algorithm

如何计算文件的熵? (或者让我们说一堆字节)
我有一个主意,但是我不确定它在数学上是正确的。

我的想法如下:

  • 创建一个由256个整数组成的数组(全为零)。
  • 遍历文件及其每个字节,
    增加数组中的相应位置。

  • 最后:计算数组的“平均值”值。

  • 用零初始化一个计数器,
    并为每个数组条目:
    将条目的差值加到“平均值”的计数器上。

好吧,现在我被卡住了。如何以所有结果都在0.0到1.0之间的方式“投影”计数器结果?但我敢肯定,这个主意还是有矛盾的…

我希望有人有更好,更简单的解决方案?

注意:我需要整个事情来对文件的内容进行假设:(
纯文本,标记,压缩或某些二进制文件,…)


阅读 780

收藏
2020-07-28

共1个答案

一尘不染

  • 最后:计算数组的“平均值”值。
  • 用零初始化一个计数器,并为每个数组条目:将条目的差值加到“平均值”的计数器上。

经过 一些 修改,您可以得到香农的熵:

重命名“平均”为“熵”

(float) entropy = 0
for i in the array[256]:Counts do 
  (float)p = Counts[i] / filesize
  if (p > 0) entropy = entropy - p*lg(p) // lgN is the logarithm with base 2

编辑: 正如韦斯利所说,我们必须将熵除以8才能在 0 范围内进行调整 1
(或者,我们可以使用对数底数256)。

2020-07-28