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.
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
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.
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
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.
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."
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.
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
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.
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
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."