2009-12-06 15 views
8

J'implémente l'algorithme de Huffman en C. J'ai la fonctionnalité basique jusqu'à l'obtention des mots de code binaires. Ainsi, par exemple, abcd sera 100011000 ou quelque chose de similaire. Maintenant, la question est de savoir comment écrire ce code sous forme binaire dans le fichier compressé. Je veux dire si je l'écris normalement chaque 1 et 0 sera un caractère donc il n'y a pas de compression.Ecriture de fichiers sous forme de bits dans un fichier en C

J'ai besoin d'écrire ces 1 et 0 sous leur forme de bit. est-ce possible en C. si oui comment?

+0

Non, ce n'est pas possible. Et cette question est une dupe. –

+0

bien que je demandais simplement comment faire dans cette situation.écrire les codes simplement comme AScii ne sert pas le but. il doit y avoir un autre moyen. – sfactor

+0

vous devriez générer un int au lieu d'un char * dans la fonction de codage, ou bien écrire une fonction qui convertira la chaîne en un int ou long représentant cette séquence de bits. –

Répondre

16

morceaux Collectionnez jusqu'à ce que vous avez assez de bits pour remplir un octet, puis écrire ..

PAR EXEMPLE quelque chose comme ceci:

int current_bit = 0; 
unsigned char bit_buffer; 

FILE *f; 

void WriteBit (int bit) 
{ 
    if (bit) 
    bit_buffer |= (1<<current_bit); 

    current_bit++; 
    if (current_bit == 8) 
    { 
    fwrite (&bit_buffer, 1, 1, f); 
    current_bit = 0; 
    bit_buffer = 0; 
    } 
} 

Une fois que vous avez fini d'écrire vos bits, vous devez vider le tampon. Pour ce faire, il suffit d'écrire les bits jusqu'à ce que current_bit soit égal à zéro:

void Flush_Bits (void) 
{ 
    while (current_bit) 
    WriteBit (0); 
} 
+0

merci de le signaler ... alors comment terminer le fichier alors? ... Je présume que nous devons le faire nous-mêmes dans ce cas. – sfactor

+0

suffit d'appeler Flush_Bits comme défini ci-dessus. –

+0

Il y a un problème dans le code: Vous ne changez que quand un bit est activé. Supposons que vous voulez sortir '10000000'. Le 1 n'atteindra jamais la position de bit la plus significative, non? –