2016-11-05 6 views
0

Ich implementiere Huffman-Codierung in C++ und ich kann erfolgreich einen Huffman-Baum erstellen und kann Zeichenfolgen codieren/decodieren.Huffman-Coding-Datei in C++

Das nächste, was ich tun möchte, ist in der Lage, Dateien zu kodieren/zu decodieren, aber ich habe ein paar Probleme. Ich verwende Bool-Vektoren, um die Codewörter zu enthalten. Mein Problem ist: Ich kann nur Bytes in eine Datei schreiben. Wie schreibe ich Stück für Stück? Gibt es vielleicht eine Bibliothek, die ich benutzen kann?

Die andere Sache ist, dass, wenn ich eine Datei dekodieren möchte ich den Baum selbst (oder die Codetabelle). Was ist der beste Weg, um den Baum zu serialisieren?

Jede Hilfe würde sehr geschätzt werden.

+0

Zwei mögliche Optionen: Codieren Sie die Bits in Bytes. Oder benutze ein Byte pro Bit. –

+0

Dies ist Ihre Formatspezifikation, also tun Sie was Sie wollen. Wenn Sie die Bits fest packen wollen, dann verbinden Sie die Bitvektoren und schreiben sie 8 Bits gleichzeitig. Wenn Sie Ihre Codes in Byte-artige Blöcke schreiben wollen, tun Sie das. Sie können Ihren Baum in ein Array (sehen Sie sich Baum Traversals) oder eine Kantenliste und schreiben Sie, wie Sie möchten. Es gibt zu viele Optionen, da du nicht wirklich angegeben hast, was du bereits hast ... – BeyelerStudios

+0

Was dein zweites Problem betrifft, gibt es grundsätzlich nur drei Möglichkeiten, [einen Baum zu durchqueren] (https://en.wikipedia.org/wiki)/Tree_traversal). Wähle eins. Und anstatt "anzuzeigen", schreiben Sie den Baum auf die Festplatte. Tun Sie das Gegenteil, wenn Sie die Datei lesen. –

Antwort

2

Zu schade, dass das interne Format eines C++ bool-Vektors nicht definiert ist, da es sehr wahrscheinlich bereits gepackte Bits sind.

Auf jeden Fall würden Sie die <<, >> und & Operatoren Bits in Bytes auf der Codierung Seite zu packen, sowie die Bits auf der Decodierungsseite entpacken. Angenommen, Sie wissen, dass ein Byte aus acht Bits besteht, ist das trivial.

Wie für die Übertragung eines Huffman-Codes lesen Sie über kanonische Huffman-Codes. Sie müssen den Code nicht senden, nur die Codelänge in Bits für jedes Symbol. Für eine größere Effizienz kann die Sequenz von Längen selbst mit Lauflängen- und Huffman-Codierung komprimiert werden. Ein Beispiel finden Sie in der Deflate format.

+1

Kaum eine posthume Antwort von Prof. Huffman zu bekommen, ist es schwierig, an jemanden zu denken, der auf diesem Gebiet mehr Experte ist ... –