Laden...

Datenkompression - wo setze ich die verschiedenen Methoden an?

Erstellt von blutiger_anfänger vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.250 Views
B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 14 Jahren
Datenkompression - wo setze ich die verschiedenen Methoden an?

Guten Morgen,
ich hoffe der Titel ist einigermaßen verständlich. Ich möchte mich gerne, rein Interesse halber, ein wenig mit Datenkompression beschäftigen. Dazu habe ich mir schon die Grundsätze der ein oder anderen Kompressionsmethode angeschaut. Ich denke auch, dass ich die Gedankengänge dahinter verstanden habe, jedoch weiß ich nicht wie ich diese ansetzen soll.
Bei Methoden/Theorien, die z.B. Bytes sortieren und Gruppieren ist mir das klar. Ich würde die zu komprimierende/kodierende Datei mit einem Binaryreader einlesen und mit den Bytes arbeiten.
Jetzt gibt es ja auch Methoden, die besagen, dass man doppelte Wörter durch Tokens ersetzt und die dann in einer Tabelle anlegt.
Jedoch macht das ja eigentlich nur Sinn, wenn ich auch eine relative große Fülle an Zeichen haben bzw. einen Text. Kann man diese Methoden nur auf Textdateien anwenden, oder wie müsste ich eine .exe, oder eine Datei unbekannten Formats öffnen um diese Methode anzuwenden?
Wenn ich diese mit dem Binary Reader einlese, dann erhalte ich ja nur die Bytes, keinen Reintext, somit weniger Zeichen und mehr, bezihungsweise kleinere Tokens, somit ein größeres Wörterbuch und eine schlechtere Kompressionsrate.

Ich hoffe Ihr könnt mir folgen.

Liebe Grüße,
Raffi

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo blutiger_anfänger,

... und eine schlechtere Kompressionsrate.

es lassen sich ja auch nicht alle Dateien/Dateiarten gleich gut komprimieren. Es kommt immer darauf an, wie groß die Redundanzen sind.

Wobei eine EXE-Datei nicht unbedingt weniger Redundanzen als eine Text-Datei hat, z.B. kann es dort sein, dass größere Bereiche einfach aus Null-Bytes bestehen ==> Run-Length-Encoding.

herbivore

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 14 Jahren

Heißt also bei Binarys macht solch eine "Wörterbuchkompression" eher weniger Sinn, wenn ich das richtig verstanden habe?
Nur um noch mal sicher zu gehen - .exe Dateien muss ich also als Bytes einlesen und dann damit arbeiten, oder kann ich diese auch anders einlesen? Bzw. Macht es Sinn die Bytes ins Hexadezimalssystem umzurechnen, dank eines größeren Zeichensatzes, dann zu kodieren und danach wieder in Bytes umzurechnen und abzuspeichern?

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo blutiger_anfänger,

Heißt also bei Binarys macht solch eine "Wörterbuchkompression" eher weniger Sinn, wenn ich das richtig verstanden habe?

Je "zufälliger" die Bytefolgen sind, desto weniger kann man sie überhaupt komprimieren, egal mit welcher Methode.

exe Dateien muss ich also als Bytes einlesen [...]?

Ja!

Bzw. Macht es Sinn die Bytes ins Hexadezimalssystem umzurechnen, dank eines größeren Zeichensatzes, dann zu kodieren und danach wieder in Bytes umzurechnen und abzuspeichern?

Nein, überhaupt keinen!

herbivore

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 14 Jahren

Also heißt das im Klartext:
* lösen von dem Gedanken, dass ich mit "Text" arbeiten kann
* generell die Methoden auf Bytes beziehen

liebe Grüße,
Raffi

p.s.: Ich war nur verwundert, weil in den Beispielen immer mit Klartext gearbeitet wurde

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

C
114 Beiträge seit 2008
vor 14 Jahren

Also in den meisten Beispielen bezieht man sich auf Texte, weil es so natürlich anschaulicher ist. Aber im Regelfall sind absolut alle Methoden auf Bytes umzusetzen, teilweise muss man sie nur etwas abändern. Ein Beispiel für einen Algorithmus der ansich nur für Text gedacht ist, wäre ACB. Aber selbst der ist mit viel Arbeit auf Bytes awendbar. Das größte Problem hatte ich beim "nachprogrammieren" meistens mit der Geschwindigkeit.

„Heute back ich, morgen brau ich,
übermorgen cast ich die Königin nach int;
ach, wie gut dass niemand weiß,
dass ich Rumpelstilzchen heiß!“

"Bei Stylefragen sollteste nen Mac-User oder ne Frau fragen."

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 14 Jahren

Ok dann hätte ich da noch eine Frage zur praktischen Bearbeitung. Wenn ich eine .exe Datei mit dem Binaryreader einlese, dann habe ich ein Bytearray. Nun könnte ich die Bytes hintereinander in einen String schreiben und diesen komprimieren. Jedoch sind manche Bytes 2-stellig, machne 3-stellig. Sprich ich habe am Ende einen riesigen Datensalat.
Bin ich also wirklich gezwungen dem komprimierten String noch eine Liste mit der Länge der Originalbytes mitzugeben. Damit ich später nach der Dekompression den dekomprimierten String wieder in korrekt Lange Bytes zerlegen kann?

Oder macht es hier mehr Sinn den Krams ins Heyadezimal System umzurechnen (ja ich weiß, dass herbivore sagte: nein), da ich dann immer in zweier Schritten wieder in Bytes zurückrechnen kann?

Liebe Grüße,
Raffi

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo blutiger_anfänger,

Nun könnte ich die Bytes hintereinander in einen String schreiben

da man ohnehin nicht jede Bytefolge in einen String wandeln kann, solltest du - wie schon oben gesagt - Strings vergessen.

Oder macht es hier mehr Sinn den Krams ins Heyadezimal System umzurechnen (ja ich weiß, dass herbivore sagte: nein)

Ja, und dabei bleibe ich auch.

Ich denke, wir kommen langsam vom Thema ab. Ich vermute ein Fall von [Hinweis] Wie poste ich richtig? Punkt 1.1.1, dass du unbedingt mit Strings arbeiten willst, obwohl das weder nötig noch sinnvoll ist.

herbivore

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 14 Jahren

Da hast du mich vielleicht falsch verstanden... Ich will die Bytes nicht in normale Zeichen umrechnen, also in A,B,C..., sondern einfach nur die Bytes - die Zahlen(-folgen) in einen String schreiben, damit ich diesen String dann nach gewissen Zahlenverkettungen, Wiedrholungen durchsuchen kann. So war das gemeint. Ich hfofe ich habe dich jetzt nicht falsch verstanden.

Liebe Grüße,
Raffi

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo blutiger_anfänger,

sondern einfach nur die Bytes - die Zahlen(-folgen) in einen String schreiben

und das geht - wie gesagt - nicht mit jeder Bytefolge, zumindest nicht bei jedem Encoding. Außerdem ist es - wie jetzt schon mehrfach gesagt - gar nicht nötig. Alles was du willst, kann und sollte man direkt auf den Byte-Arrays machen.

herbivore

C
114 Beiträge seit 2008
vor 14 Jahren

Ich verstehe, wie herbivore, dein Problem garnicht. Wieso willst du es auf einen String klatschen? Du kannst doch genauso gut auf dem Byte-Array arbeiten. Das ist auch die übliche Vorgehensweise. Sonst kannst du jedes byte auch noch auf einen char casten und dir daraus einen String basteln. Das kostet aber unnötig Zeit und macht absolut keinen Sinn. Also ich empfehle dir, arbeite auf Byte-Arrays und wenn du dann noch ein konkretes Problem hast, dann fragst du noch einmal nach. Bezüglich Datenkompression hab ich auch schon viel gemacht und ich gebe dir gerne ein paar Antworten 😉

„Heute back ich, morgen brau ich,
übermorgen cast ich die Königin nach int;
ach, wie gut dass niemand weiß,
dass ich Rumpelstilzchen heiß!“

"Bei Stylefragen sollteste nen Mac-User oder ne Frau fragen."