Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Huffman Decode and Encode


RamiroCruzo - Mi 04.01.17 19:21
Titel: Huffman Decode and Encode
Hallo

Ich habe Huffman-Codes und length für eine komprimierte Datei. Ich möchte es decodieren und kodieren es zurück.

Problem ist, dass ich neu in Huffman bin und bin nicht in der Lage, es umzusetzen.

Jedermann haben Lösung?


Quelltext
1:
2:
3:
HuffmanCodes = { 0x00, 0x02, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F };

HuffmanLengths = { 2, 2, 3, 3, 3, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 };


mandras - Do 05.01.17 00:21

Könntest Du die Frage bitte präzisieren? Ich verstehe das Problem nicht.


mandras - Fr 06.01.17 22:45

vielleicht hilft dies weiter:

http://www.iti.fh-flensburg.de/lang/algorithmen/code/huffman/huffman.htm

Ansonsten gab es in der Zeitschrift c/t 1991 einen guten Artikel hierzu (Titel war glaube ich "imploding, freezing, done"), der noch im Online-Shop vorhanden ist.


RamiroCruzo - Sa 07.01.17 04:38

Ich versuchte es zu tun, aber alle Guides sind auf Decodierung mit Huffman-Tabelle :(


Narses - Sa 07.01.17 12:23

Moin!

Your German sounds like a non-native speaker. ;) If you like to speak english because it's easier for you, your're welcome. Most of our community members do understand it, too. :nixweiss:

Ich mach hier aber trotzdem nochmal in Deutsch weiter. ;)

Die beiden "Listen" aus deinem Eingangsposting lassen sich doch durchaus als "Tabelle" auffassen: die erste sind die Bitmuster, die zweite die Bitlänge. :idea: In meiner Erinnerung funktioniert Huffman doch genau so. :?

cu
Narses


Ralf Jansen - Sa 07.01.17 12:43

Zitat:
Die beiden "Listen" aus deinem Eingangsposting lassen sich doch durchaus als "Tabelle" auffassen: die erste sind die Bitmuster, die zweite die Bitlänge. :idea: In meiner Erinnerung funktioniert Huffman doch genau so. :?

Ja aber aus den gezeigten Angaben bekommen wir nur die eindeutigen Codewörter. Aber auf welche unkodierten Codewörter mappen die? Das kann ich aus diesen beiden Arrays nicht erkennen.

Es kann natürlich irgendwie im Format versteckt sein. Aka die Position im Array entspricht dem ursprünglichen unkodierten Wort. Eine spekulative Lösung wäre man hat 4bit Wörter kodiert. Die Array sind ja 16 Einträge lang. Und man könnte dann einfach Annehmen das der erste Eintrag dann 0b0000 entspricht und der letzte 0b1111.

Dann hätte man das Mapping


Quelltext
1:
2:
3:
4:
5:
6:
7:
unkodiert       kodiert
0b0000          0b00 (0x00)
0b0001          0b10 (0x02)
.....            
0b1000          0b111111 (0x37)
.....
0b1111          0b1111111 (0x7F)


Die Längen der Codewörter sehen dafür aber zu sortiert aus damit das wirklich so gedacht ist (kann natürlich auch Zufall sein). Ich gehe mal davon aus das uns noch irgendeine Info fehlt.

PS Mapping nochmal überarbeitet, Habe zwar selbst von 4bit Wörtern gesprochen konnte mich aber gedanklich offensichtlich nicht von Bytes trennen :(