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