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
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.
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.
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.
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.
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).
nie trzeba liczyć liczby elementów pliku, które mogą być dostosowane do charakteru specjalnego –