2009-12-06 11 views
8

Implementuję algorytm Huffmana w C. Mam podstawową funkcjonalność aż do punktu, w którym uzyskuje się binarne słowa kodowe. więc na przykład abcd będzie miało 100011000 lub coś podobnego. teraz pytanie brzmi: jak zapisać ten kod w postaci binarnej w skompresowanym pliku. Mam na myśli to, że jeśli piszę to normalnie, każde 1 i 0 będą jednym znakiem, więc nie ma kompresji.Zapisywanie plików w postaci bitów do pliku w C

Muszę zapisać te 1 i 0 w ich formie bitowej. czy jest to możliwe u C. jeśli tak, to w jaki sposób?

+0

Nie jest to niemożliwe. I to pytanie jest dupkiem. –

+0

cóż, ja tylko pytałem, jak to zrobić w tej sytuacji. Pisanie kodów po prostu jako ascii nie służy temu celowi. musi być jakiś inny sposób. – sfactor

+0

powinieneś wygenerować int zamiast znaku * w funkcji kodowania lub napisać funkcję, która przekształci ciąg znaków w int lub long reprezentujący tę sekwencję bitów. –

Odpowiedz

16

Collect bity dopóki nie masz wystarczająco dużo, aby wypełnić bity bajt, a następnie zapisać go ..

np coś takiego:

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; 
    } 
} 

Po zakończeniu pisania bitów należy opróżnić bufor bitów. Aby to zrobić, po prostu zapisz bity, aż current_bit będzie równe zero:

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

dzięki za wskazanie tego ... więc jak zakończyć plik następnie? ... Zakładam, że musimy to zrobić sami w tym przypadku. – sfactor

+0

po prostu zadzwoń do Flush_Bits jak zdefiniowano powyżej. –

+0

Wystąpił problem w kodzie: Przesuwa się tylko, gdy bit jest ustawiony. Załóżmy, że chcesz wyprowadzić '10000000'. 1 nigdy nie osiągnie najbardziej znaczącej pozycji bitu, prawda? –