2 Stimmen

Schreiben des Huffman-Baums in eine Datei nach der Komprimierung

Ich versuche, einen Huffman-Baum in die komprimierte Datei zu schreiben, nachdem die eigentlichen Daten der komprimierten Datei eingefügt worden sind. Aber ich habe gerade ein kleines Problem erkannt. Angenommen, ich entscheide mich dafür, dass ich, sobald alle meine tatsächlichen Daten in die Datei geschrieben wurden, 2 Zeilenvorschubzeichen einfüge und dann den Baum schreibe. Das heißt, wenn ich die Daten zurücklese, sind diese beiden Zeilenvorschübe (oder jedes andere Zeichen) meine Begrenzungszeichen. Das Problem ist, dass es durchaus möglich ist, dass die tatsächlichen Daten auch 2 Zeilenumbrüche hintereinander haben, in einem solchen Szenario würde meine Trennzeichenprüfung fehlschlagen. Ich habe das Beispiel von zwei Zeilenumbrüchen hier genommen, aber das gleiche gilt für jede Zeichenkette, ich könnte das Problem umgehen, indem ich vielleicht eine längere Zeichenfolge als Begrenzer nehme, aber das würde zwei unerwünschte Effekte haben: 1. Es besteht immer noch die entfernte Möglichkeit, dass die lange Zeichenkette zufällig in den komprimierten Daten enthalten ist. 2. Unnötige Aufblähung einer Datei, die komprimiert werden muss.

Hat jemand einen Vorschlag, wie man die komprimierten Daten von den Baumdaten trennen kann?

3voto

user1071136 Punkte 15458

Geben Sie zunächst die Größe des Baums in Bytes an. Dann schreiben Sie den Baum selbst, und dann den Inhalt selbst.

Beim Lesen lesen Sie zuerst die Größe, dann den Baum (jetzt wissen Sie, wie viele Zeichen Sie lesen müssen) und dann den Inhalt.

Die Größe kann als Zeichenkette geschrieben werden, die mit einem Zeilenvorschub endet - auf diese Weise wissen Sie, dass die erste Zahl und die Zeilenvorschübe zur Größe des Baums gehören.

0voto

Tiger-222 Punkte 6070

Warum schreibt man nicht die Größe und die Länge auf die ersten 8 Bytes (je 4) und dann die Daten? Dann etwas wie:

uint32_t compressed_size;
uint32_t data_len;
char * data;

file.read((char*)compressed_size, 4);
file.read((char*)data_len, 4);
data = new char[data_len];
zip.read(data, data_len);

Sollte funktionieren. Sie können die Daten zur besseren Komprimierung deflationieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X