2009-04-05 18 views
7

Próbuję zaimplementować algorytm Huffmana do kompresji, który wymaga zapisywania bitów o zmiennej długości do pliku. Czy jest jakiś sposób w C++ do zapisu danych o zmiennej długości z 1-bitową ziarnistością do pliku?Kodowanie Huffmana

Odpowiedz

9

Nie, najmniejsza ilość danych, jaką można zapisać do pliku, to jeden bajt.

Możesz użyć bitset, aby ułatwić sobie manipulowanie bitami, a następnie użyć do zapisywania do pliku ofstream. Jeśli nie chcesz używać bitsetu, możesz użyć bitwise operators do manipulowania danymi przed ich zapisaniem.

3

Najmniejsza liczba bitów, które można uzyskać i zapisać, wynosi 8 = 1 bajt. Możesz uzyskać dostęp do bitów w bajcie za pomocą operatorów bitów^& |.

można ustawić n'th bitu do 1 przy użyciu:

my_byte = my_byte | (1 << n); 

gdzie n wynosi od 0 do 7.

można ustawić n'th bit 0 z:

my_byte = my_byte & ((~1) << n); 

Możesz przełączać n-ty bit za pomocą:

my_byte = my_byte^(1 << n); 

Więcej szczegółów here.

2

Odpowiedź Klew jest prawdopodobnie tą, której chcesz, ale żeby dodać coś do tego, co powiedział Bill, biblioteki Boost mają dynamic_bitset, które okazały się pomocne w podobnej sytuacji.

1

Nie. Będziesz musiał spakować bajty. W związku z tym będziesz potrzebował w swoim pliku nagłówka, który określa liczbę elementów w twoim pliku, ponieważ prawdopodobnie masz nieużywane bity końcowe.

+0

nie trzeba liczyć liczby elementów pliku, które mogą być dostosowane do charakteru specjalnego –

2

Wszystkie informacje potrzebne na bitowej twiddling jest tutaj:
How do you set, clear, and toggle a single bit?

Lecz najmniejszy obiekt, który można umieścić w pliku jest bajt.
Chciałbym użyć dynamic_bitset i za każdym razem, gdy rozmiar zwiększył się do 8, wypakuj 8 dolnych bitów do znaku i zapisz go w pliku, a następnie przenieś pozostałe bity w dół o 8 miejsc (powtórz).