Pour calculer l'entropie d'information d'une collection d'octets, vous devrez faire quelque chose de similaire à la réponse de Tydok. (La réponse de tydok fonctionne sur une collection de bits).
Les variables suivantes sont supposées exister déjà :
-
byte_counts
est une liste de 256 éléments du nombre d'octets avec chaque valeur dans votre fichier. Par exemple, byte_counts[2]
est le nombre d'octets qui ont la valeur 2
.
-
total
est le nombre total d'octets dans votre fichier.
Je vais écrire le code suivant en Python, mais ce qui se passe devrait être évident.
import math
entropy = 0
for count in byte_counts:
# If no bytes of this value were seen in the value, it doesn't affect
# the entropy of the file.
if count == 0:
continue
# p is the probability of seeing this byte in the file, as a floating-
# point number
p = 1.0 * count / total
entropy -= p * math.log(p, 256)
Il y a plusieurs choses qu'il est important de noter.
-
Le chèque de count == 0
n'est pas seulement une optimisation. Si count == 0
alors p == 0
et log( p ) sera indéfini ("infini négatif"), ce qui entraînera une erreur.
-
Le site 256
dans l'appel à math.log
représente le nombre de valeurs discrètes possibles. Un octet composé de huit bits aura 256 valeurs possibles.
La valeur obtenue sera comprise entre 0 (chaque octet du fichier est identique) et 1 (les octets sont répartis de manière égale entre toutes les valeurs possibles d'un octet).
Une explication de l'utilisation de la base logarithmique 256
Il est vrai que cet algorithme est généralement appliqué en utilisant la base logarithmique 2. Cela donne la réponse résultante en bits. Dans ce cas, vous disposez d'un maximum de 8 bits d'entropie pour un fichier donné. Essayez vous-même : maximisez l'entropie de l'entrée en faisant byte_counts
une liste de tous les 1
ou 2
ou 100
. Lorsque les octets d'un fichier sont répartis uniformément, vous constaterez qu'il y a une entropie de 8 bits.
Il est possible d'utiliser d'autres bases logarithmiques. Utilisation de b \=2 permet un résultat en bits, car chaque bit peut avoir 2 valeurs. En utilisant b \=10 met le résultat dans dits ou bits décimaux, car il y a 10 valeurs possibles pour chaque dit. Utilisation de b \=256 donnera le résultat en octets, car chaque octet peut avoir une des 256 valeurs discrètes.
Il est intéressant de noter qu'en utilisant les identités logarithmiques, vous pouvez trouver comment convertir l'entropie résultante entre les unités. Tout résultat obtenu en unités de bits peut être converti en unités d'octets en divisant par 8. Comme effet secondaire intéressant et intentionnel, cela donne à l'entropie une valeur comprise entre 0 et 1.
En résumé :
- Vous pouvez utiliser différentes unités pour exprimer l'entropie.
- La plupart des gens expriment l'entropie en bits ( b \=2)
- Pour une collection d'octets, cela donne une entropie maximale de 8 bits.
- Puisque le demandeur veut un résultat entre 0 et 1, divisez ce résultat par 8 pour obtenir une valeur significative.
- L'algorithme ci-dessus calcule l'entropie en octets ( b \=256)
- Ceci est équivalent à (entropie en bits) / 8
- Cela donne déjà une valeur entre 0 et 1
2 votes
Vérifiez Recherche d'anomalies d'entropie dans les données
1 votes
Vous voulez dire une entropie métrique ? Entropie divisée par la longueur du message.
0 votes
Aïe, cette note que vous avez ajoutée :
Note: I need the whole thing to make assumptions on the file's contents: (plaintext, markup, compressed or some binary, ...)
... Vous venez de demander de la magie divine, bonne chance pour développer une compression de données prouvée optimale.0 votes
Pouvez-vous publier, s'il vous plaît, un pseudo-code de votre résultat final ?