Kodierung von Byte-Daten in Ziffern

8

Gibt es eine übliche Methode, um beliebige Daten zu kodieren und zu dekodieren, so dass das kodierte Endergebnis nur aus Zahlen besteht - wie base64_encode, aber ohne die Buchstaben?

Fiktives Beispiel:

%Vor%     
Pekka 웃 05.06.2010, 21:08
quelle

4 Antworten

11

Sie können sich eine Zeichenfolge (einzelnes Bytezeichen) als codierte Basis-256-Zahl vorstellen, wobei "\ x00" für 0 steht, "(Leerzeichen, dh" x20 ") für 32 usw. bis" \ xFF ", was 255 darstellt.

Eine Darstellung nur mit den Zahlen 0-9 kann einfach durch Ändern der Darstellung in Basis 10 erreicht werden.

Beachten Sie, dass "base64 encoding" keine Basiskonvertierung ist. base64 unterteilt die Eingabe in Gruppen von 3 Bytes (24 Bits) und führt die Basiskonvertierung für diese Gruppen einzeln durch. Dies funktioniert gut, da eine Zahl mit 24 Bits mit vier Ziffern in der Basis 64 (2 ^ 24 = 64 ^ 4) dargestellt werden kann.

Das ist mehr oder weniger das, was el.pescado tut - er teilt die Eingabedaten in 8-Bit-Teile auf und wandelt dann die Zahl in die Basis 10 um. Jedoch hat diese Technik einen Nachteil relativ zur Kodierung der Basis 64 - sie stimmt nicht korrekt mit der Bytegrenze überein. Um eine Zahl mit 8 Bits darzustellen (0-255, wenn nicht vorzeichenbehaftet) benötigen wir drei Ziffern in der Basis 10. Die linke Ziffer hat jedoch weniger Informationen als die anderen. Es kann entweder 0, 1 oder 2 sein (für vorzeichenlose Zahlen).

Eine Ziffer in der Basis 10 speichert log (10) / log (2) Bits. Unabhängig von der von Ihnen gewählten Chunk-Größe können Sie die Repräsentationen niemals mit 8-Bit-Bytes (im Sinne von "Ausrichtung", die ich im vorherigen Absatz beschrieben habe) ausrichten. Folglich ist die kompakteste Darstellung eine Basiskonvertierung (die Sie sehen können, als wäre es eine "Basiscodierung" mit nur einem großen Chunk).

Hier ist ein Beispiel mit bcmath .

%Vor%

Für

%Vor%

wir bekommen

%Vor%

Da jede Ziffer nur log(10)/log(2)=~3.32193 Bits codiert, ist zu erwarten, dass die Zahl tendenziell 140% länger (nicht 200% länger als bei el.pescado).

    
Artefacto 04.08.2010, 05:54
quelle
7

Nun, das wäre "Base 8" -Codierung anstatt Base 64. Das ist besser bekannt als Octal.

All Base64 konvertiert Bitströme in 6-Bit-Blöcke (0-63) und weist ein Zeichen aus einem 64-Zeichen-Zeichensatz zu. Octal verwendet 3 Bits, 0-7. Also könnte ABCDEFGH verwendet werden, stattdessen wird 0-7 verwendet. Sie können 0-9 nicht (einfach) verwenden, da 0-9 bis zu 4 Bit, aber nicht vollständig 4 Bit ist. Das macht es eine lausige Codierung für Binärdaten.

    
Will Hartung 05.06.2010 21:13
quelle
2

Sehr einfaches Beispiel - es stellt jedes Eingangsbyte als 3-stellige Dezimalzahl dar:

%Vor%

Nachteil ist, dass es die Größe aller Eingabedaten verdreifacht (jedes Eingabebyte wird als drei Ausgabebytes dargestellt).

Die Decodierfunktion wird dem Leser als Übung überlassen;)

    
el.pescado 05.06.2010 21:21
quelle
2

Unabhängig davon, wie Sie kodieren, enden Sie immer auf einer kleineren Basis. Es kann möglich sein, die resultierende Ganzzahl mit einigen dechex () - Konvertierungen etwas kleiner zu verkleinern, aber letztendlich speichern Sie nur ein paar Zeichen. Davon abgesehen, ballert die Zahl wirklich in dem Moment, in dem Sie Multi-Byte-Zeichen mit 0-9 darstellen.

Ich frage mich, ob ganze Zahlen als IDs, Wörter oder vollständige Strings darstellen, keinen geringeren Platzbedarf haben. Nicht wirklich eine direkte Kodierung, sondern eine praktikable Option.

@ el.pescado bekommt Kredit für die erste Hälfte, aber er hat den Leser herausgefordert. Also habe ich geantwortet (hauptsächlich weil ich verstehen wollte, was passiert).

%Vor%     
allnightgrocery 06.06.2010 01:57
quelle

Tags und Links