Beispiel #1
0
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)
Beispiel #2
0
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)