2009-04-05 15 views
7

Ich versuche, den Huffman-Algorithmus für die Komprimierung zu implementieren, die das Schreiben von Bits variabler Länge in eine Datei erfordert. Gibt es eine Möglichkeit in C++, Daten variabler Länge mit 1-Bit-Granularität in eine Datei zu schreiben?huffman encoding

Antwort

9

Nein, die kleinste Datenmenge, die Sie in eine Datei schreiben können, ist ein Byte.

Sie können verwenden, um Bits einfacher zu bearbeiten, und dann ofstream verwenden, um in Datei zu schreiben. Wenn Sie kein Bitset verwenden möchten, können Sie die Daten vor dem Speichern mit bitwise operators bearbeiten.

3

Die kleinste Menge an Bits, auf die Sie zugreifen und speichern können, ist 8 = 1 Byte. Mit den Bitoperatoren^& | können Sie auf Bits in Byte zugreifen.

Sie n-te Bit auf 1 gesetzt verwenden kann:

my_byte = my_byte | (1 << n); 

wobei n 0 bis 7

Sie n-te Bit auf 0 gesetzt verwenden kann:

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

Sie können das n-te Bit umschalten mit:

Mehr Details here.

2

Die Antwort von klew ist wahrscheinlich die, die Sie wollen, aber um etwas hinzuzufügen, was Bill sagte, haben die Boost-Bibliotheken eine dynamic_bitset, die ich in einer ähnlichen Situation hilfreich fand.

1

Nein. Sie müssen Bytes packen. Dementsprechend benötigen Sie einen Header in Ihrer Datei, der angibt, wie viele Elemente sich in Ihrer Datei befinden, da Sie wahrscheinlich nicht verwendete nachgestellte Bits haben.

+0

Sie müssen die Anzahl der Elemente der Datei nicht unbedingt zählen. Ein Sonderzeichen kann der Rechnung entsprechen –

2

Alle Informationen, die Sie auf Bit twiddling brauchen:
How do you set, clear, and toggle a single bit?

Aber das kleinste Objekt, das Sie in einer Datei speichern, kann ein Byte.
Ich würde dynamic_bitset verwenden und jedes Mal, wenn die Größe größer als 8 wurde, extrahiere die unteren 8 Bits in ein Zeichen und schreibe dies in eine Datei, dann verschiebe die restlichen Bits um 8 Stellen (wiederhole).