def traiterFichier(bitsDuFichier, nomFichier, bavard): """ Fait appel aux fonctions Huffman (dans Huffman.py) pour déterminer la structure de l’arbre, séparer les bit arbre des bits caractères des bits de texte et récupérer le texte, puis appelle la fonction enregistrerFichier :param bitsDuFichier: liste de bits :return: """ listeBits, listeCaracs = separerCarac( bitsDuFichier ) # bitsDuFichier ne contient plus que arbre + texte apres cette ligne nombreDeFeuilles = 0 def reconArbre(arbre, listeBits): nonlocal nombreDeFeuilles if (listeBits[0] == 1): # Si on est sur une feuille if (nombreDeFeuilles != listeCaracs[0]): if ( nombreDeFeuilles >= listeCaracs[0] ): # Pour ne pas compter le carac de fin de fichier qui decale carac = listeCaracs[nombreDeFeuilles] else: carac = listeCaracs[nombreDeFeuilles + 1] else: carac = -1 # Caractere de fin de fichier nombreDeFeuilles += 1 return [0, carac] # On retourne la feuille else: k = 0 # Cette partie permet de détecter à quel endroit est la branche droite. Pour cela, elle compte le nombre de sous branches (0) et le nombre de caracteres (1) jusqu'a qu'ils s'egalisent. La fin de la branche est donc au k ieme bit count = [0, 0] for i in listeBits: k += 1 if (i == 0): count[0] += 1 else: count[1] += 1 if (count[0] == count[1]): break return [ 0, reconArbre(arbre, listeBits[1:]), reconArbre(arbre, listeBits[k:]) ] # On retourne le noeud arbre = reconArbre([], listeBits) if (bavard): print(Huffman.afficher_arbre(arbre, [1], "(" + str(arbre[0]) + ")")) donnees = Huffman.convertirHuffman( bitsDuFichier[2 * len(listeCaracs) - 1:], arbre) enregistrerFichier(donnees, nomFichier)
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)