def testsHuffman(): print("### Tests Huffman ###") assert Huffman.creerArbre(dict()) == [0, -1] # Arbre poids 0, caractere de fin de fichier seulement assert Huffman.creerArbre({100: 3, 101: 1}) == [4, [1, [0, -1], [1, 101]], [3, 100]] assert Huffman.creerArbre({100: 0}) == [0, [0, 100], [0, -1]] assert Huffman.remonterAuNoeudNonExplore([1, 1, 2, 2, 2]) == [ 1] # Doit remonter juste avant la derniere fois ou on a prit a gauche. 1 signifie gauche, 2 droite assert Huffman.remonterAuNoeudNonExplore([1]) == [] assert Huffman.arbreVersBits([4, [1, [0, -1], [1, 101]], [3, 100]]) == "00111" print("### Huffman - OK ###")
def traiterFichier(dictCarac, texteInBytes, nomFichier, bavard): arbre = Huffman.creerArbre(dictCarac) table = Huffman.etablirTable(arbre) strBitsArbre = ( Huffman.arbreVersBits(arbre) ) # Recupere structure infixe de l'abre en string de 0 et 1 strBitsTexte = Huffman.convertirTexte(texteInBytes, table) strBitsTexte += str(table[-1]) # On ajoute le carac de fin de texte strBitsArbreEtTexte = strBitsArbre + strBitsTexte bytesArbreEtTexte = [] for i in range( len(strBitsArbreEtTexte) // 8): # Cette boucle convertit string de 0 et 1 vers liste de bytes value = "" for k in range(8): # On recupere les 8 bits suivants if (8 * i + k < len(strBitsArbreEtTexte) ): # Si on ne depasse pas le nombre de bits value += strBitsArbreEtTexte[8 * i + k] else: # On complete avec des 0 pour avoir des bytes entiers value += "0" bytesArbreEtTexte.append(int(value, 2)) # On convertit en bytes listeBytesCarac = [] listeCaracTemporaire = [] k = 0 for carac, bits in table.items( ): # On fait passer le rang du carac de fin de fichier en premier if (carac == -1): # On ajoute le rang du caractère de fin de fichier listeBytesCarac.append(k) else: # Dans une autre liste on ajoute à la suite les caractères listeCaracTemporaire.append(carac) k += 1 listeBytesCarac += listeCaracTemporaire # On a ici rang du caractere de fin de fichier puis liste des autres caracteres listeBytesCarac.append( listeBytesCarac[-1]) # ON double le dernier caractere if (bavard): print( Huffman.afficher_arbre( arbre, [1], "##### ARBRE #####\n(" + str(arbre[0]) + ")")) Huffman.afficher_table(table) enregistrerFichier(listeBytesCarac + bytesArbreEtTexte, nomFichier)