Bonjour à tous j'essaie de programmer quelque chose pour me retourner la taille et l'entropie d'un fichier, mais sans succès . J'obtient la taille mais pour l'entropie...j'obtient toujours not a number (nan).
Quelqu'un peut-il m'aider?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 (**[entropie fichier] renvoie la valeur de l'entropie du fichier*) let entropie fichier = let compteurs = Array.make 256 0 (* 256 compteurs pour chacun des octets *) and somme = ref 0. (* compteur total d'octets *) in (* Parcours du fichier pour compter les différents octets qu'il contient *) let entree = open_in_bin fichier in (* canal ouvert en lecture *) let res = ref (0,0.0) in begin try while true do let n = input_byte entree in compteurs.(n) <- compteurs.(n) + 1; somme := !somme +. 1. done; with End_of_file -> let tmp = ref 0.0 in let ns = ref 0.0 in for i=0 to 255 do ns := float_of_int(compteurs.(i)); tmp := !tmp +. !ns*.log(!ns); done; res:=(int_of_float(!somme),(1./.log(2.))*.(log(!somme)-.(!tmp/.(!somme)))); close_in entree; end; !res;; (**[usage ()] imprime sur la sortie standard l'utilisation normale du programme.*) let usage () = Printf.printf "Usage : %s <fichier>\n" Sys.argv.(0) ; Printf.printf "\t <fichier> = nom du fichier dont on veut l'entropie.\n" ; exit 1 (** Procédure principale.*) let principal () = if Array.length Sys.argv <> 2 then usage () else let nb,ent = entropie Sys.argv.(1) in Printf.printf "%d octets lu(s).\n" nb ; Printf.printf "Entropie = %f bits par octet.\n" ent let _ = principal ()
Pour ensuite utiliser il faut se rendre dans le dossier où se trouve la source et faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ocamlc -c entropie.ml ocamlc -o entropie entropie.cmo ./entropie <nom_du_fichier>
Merci d'avance.
Jeremux.
Partager