Warum wird base128 nicht verwendet? [geschlossen]

90

Warum wird nur base64 anstelle von base128 verwendet, um Binärdaten im Web zu übertragen? Der ASCII-Zeichensatz enthält 128 Zeichen, die theoretisch die Basis 128 darstellen könnten, in den meisten Fällen wird jedoch nur base64, nicht jedoch base128 verwendet.

gmadar
quelle
60
Warum nicht einmal Basis 256?
Gumbo
22
Ich denke, es geht darum, druckbare Zeichen zu haben (obwohl es auch mehr als 64 gibt ...)
Felix Kling
29
Ich glaube, die Basis 128 hat uns vor einiger Zeit gehört. Das Team, das der Wachbasis 64 zugewiesen ist, hält immer noch durch.
Ritch Melton
5
Warum ist diese Frage Javascript spezifisch? Dies gilt auch für die meisten anderen Sprachen, die im Web verwendet werden, nicht wahr?
Benedikt Waldvogel
5
@ KenRockot: Ich sehe, dass Sie erkennen, dass einige Ihrer 15-Bit-Zeichen in 3 Bytes codiert werden. Ihre Basis-2048-Codierung bedeutet, 11 Bits in 2 Bytes zu packen, was 5,5 Bit pro Byte ergibt - ein halbes Bit weniger als Basis-64.
Maaartinus

Antworten:

105

Das Problem ist, dass mindestens 32 Zeichen des ASCII-Zeichensatzes "Steuerzeichen" sind, die vom empfangenden Terminal interpretiert werden können. Zum Beispiel gibt es das BEL-Zeichen (Glocke), das das empfangende Terminal läutet. Es gibt die Zeichen SOT (Start Of Transmission) und EOT (End Of Transmission), die genau das ausführen, was ihre Namen implizieren. Und vergessen Sie nicht die Zeichen CR und LF, die möglicherweise eine besondere Bedeutung dafür haben, wie Datenstrukturen zu einem Stream serialisiert / abgeflacht werden.

Adobe hat die Base85-Codierung erstellt , um mehr Zeichen im ASCII-Zeichensatz zu verwenden. AFAIK ist jedoch durch Patente geschützt.

pepoluan
quelle
7
Base91 scheint eine gute Open-Source-Option zu sein: base91.sourceforge.net
Jorge Cevallos
2
Es ist zu bedenken, dass eine Potenz von 2 leichter zu Byte-Daten passt und die Codierung einfacher ist. Dann gibt es Portabilität; Jede Sprache hat eine Base64-Codierung und / oder eine Base64-Decodierung.
Lodewijk
5
Zu Base85 und Adobe : Die Antwort könnte nützlicher sein, wenn die Patentnummern und das erteilte Jahr angegeben werden. Wenn die Patente ein Problem darstellen, gibt es immer Patente btoa, die aus dem Jahr 1990 stammen, und diese wären sicherlich sowieso abgelaufen.
Agc
65

Weil einige dieser 128 Zeichen nicht druckbar sind (hauptsächlich solche, die unter dem Codepunkt 0x20 liegen). Daher können sie nicht zuverlässig als String über den Draht übertragen werden. Wenn Sie den Codepunkt 128 überschreiten, können Codierungsprobleme auftreten, da systemübergreifend unterschiedliche Codierungen verwendet werden.

driis
quelle
8
Base94 existiert hier in Github, es verwendet alle 94 druckbaren ASCII-Zeichen: gist.github.com/iso2022jp/4054241
intrepidis
15

Wie bereits in den anderen Antworten erwähnt, besteht der entscheidende Punkt darin, den Zeichensatz auf die druckbaren zu reduzieren . Ein effizienteres Codierungsschema ist basE91, da es einen größeren Zeichensatz verwendet und dennoch Steuer- / Leerzeichen im niedrigen ASCII-Bereich vermeidet. Die Webseite enthält einen schönen Vergleich der Codierungseffizienz von Binär- und Base64- und BasE91- Codierung.

Ich habe einmal die Java-Implementierung aufgeräumt. Wenn Leute interessiert sind, könnte ich es auf GitHub pushen.

Update : Es ist jetzt auf GitHub .

Benedikt Waldvogel
quelle
Ich würde mich für die Java-Version interessieren
Michael Deardeuff
2
Pushed es zu: github.com/bwaldvogel/base91
Benedikt Waldvogel
12

Dass die ersten 32 Zeichen Steuerzeichen sind, hat absolut keine Relevanz, da Sie sie nicht verwenden müssen, um 128 Zeichen zu erhalten. Wir haben 256 Zeichen zur Auswahl, und nur die ersten 32 sind Steuerzeichen. Damit bleiben 192 Zeichen übrig, und daher sind 128 ohne Verwendung von Steuerzeichen vollständig möglich.

Hier ist der Grund: Es muss etwas sein, das gleich aussieht und das Sie kopieren und einfügen können, egal wo. Daher müssen es Zeichen sein, die in jedem Forum, Chat, E-Mail usw. gleich angezeigt werden. Das bedeutet, dass wir keine Zeichen verwenden können, die ein Forum / Chat / E-Mail-Client normalerweise zum Formatieren oder Ignorieren verwendet. Es müssen auch Zeichen sein, die unabhängig von Schriftart, Sprache und regionalen Einstellungen gleich sind.

Das ist der Grund!

user3119289
quelle
7
Die Steuerzeichen sind relevant, da so ziemlich jeder bereits davon ausgegangen ist, dass es so codepage- / codierungsneutral wie möglich sein sollte. Dies beschränkt Sie notwendigerweise auf nur (7-Bit) ASCII, eine Teilmenge der meisten relevanten Codierungen. Auch ist nicht das gesamte Internet 8-Bit sauber und ein Großteil davon ist defacto ASCII. Ihr Punkt ist es jedoch wert, angesprochen zu werden.
Tim Seguine
7
Nur zum Hinzufügen: ASCII definiert nur 128 Zeichen. Die Zeichen Nr. 128 bis Nr. 255 sind in ASCII nicht definiert. Da die Frage explizit auf ASCII und nicht auf "irgendeine 8-Bit-Codierung" verweist, beschränken sich alle Antworten auf die 128 Zeichen des ASCII-Satzes.
Pepoluan
Am Beispiel der gängigsten UTF-8-Codierung: Bytes bei 128 bis 196 würden sofort zu UTF8-Decodierungsfehlern führen. Bytes bei 196 bis 256 würden bedeuten, dass das nächste Byte ebenfalls das gleiche Zeichen hat. Wenn das nächste Byte jedoch unter 128 liegt, würde dies erneut zu UTF8-Decodierungsfehlern führen. Bei fast allen zeichencodierungsempfindlichen Sprachen würde die base64-Bibliothek jedoch base64-Zeichenfolgen als UTF8-sichere Zeichenfolgen verwenden. Dies kann mit base128 nicht durchgeführt werden, da es nicht als UTF8-sichere Zeichenfolge codiert werden kann.
SOFe
10

Base64 ist üblich, weil es eine Vielzahl von Problemen löst (funktioniert fast überall, wo Sie sich vorstellen können)

  • Sie müssen sich keine Sorgen machen, ob der Transport 8-Bit sauber ist oder nicht.

  • Alle Zeichen in der Codierung sind druckbar. Sie können sehen sie. Sie können sie kopieren und einfügen . Sie können sie in URLs (bestimmten Varianten) verwenden. etc.

  • Feste Codierungsgröße. Sie wissen, dass mBytes immer in nBytes codieren können .

  • Jeder hat davon gehört - es wird weitgehend unterstützt, es gibt viele Bibliotheken, die so einfach zu bedienen sind.

Base128 bietet nicht alle diese Vorteile.

Es sieht so aus, als wäre es 8-Bit sauber - aber denken Sie daran, dass base64 65 Symbole verwendet. Ohne einen Out-of-Band-Charakter können Sie nicht die Vorteile einer festen Codierungsgröße nutzen. Wenn Sie einen Out-of-Band-Charakter verwenden, können Sie nicht mehr 8-Bit-sauber sein.

Es ist jedoch nicht alles negativ.

  • base128 ist einfacher zu codieren / decodieren als base64 - Sie verwenden nur Verschiebungen und Masken. Kann für eingebettete Implementierungen wichtig sein

  • base128 nutzt den Transport etwas effizienter als base64, indem mehr der verfügbaren Bits verwendet werden.

Menschen tun Verwendung base128 - Ich verwende es jetzt für etwas. Es ist einfach nicht so häufig.

John La Rooy
quelle
Denken Sie auch daran, dass Mail- / Nachrichtensysteme und ihre Art (und auch XML) nicht immer freundlich zu den ersten 32 Codepunkten sind (z. B. CR LF gegen LF), aber ansonsten sieht Ihre Antwort sehr gut aus.
SamB
"Diese Base64 verwendet 65 Symbole." => Tippfehler oder habe ich etwas verpasst?
Kikiwa
@Kikiwa, schau dir dieses Java-Beispiel auf Wikipedia an . Überprüfen Sie die Länge der CODESVariablen.
John La Rooy
Oh ja, das Füllzeichen '=' nur am Ende der Codierungsnutzlast, Sie haben Recht, danke.
Kikiwa
4

Ich bin mir nicht sicher, aber ich denke, die niedrigeren Werte (die Steuercodes oder ähnliches darstellen) werden nicht zuverlässig als Text / Zeichen in HTTP-Anforderungen / Antworten übertragen, und die Werte über 127 sind möglicherweise Gebietsschema / Codepage / was auch immer spezifisch, daher gibt es keine 128 verschiedene Zeichen, von denen erwartet werden kann, dass sie auf allen Browsern / Plattformen funktionieren.

esaj
quelle
3

Esaji hat recht. Base64 wird verwendet, um Binärdaten für die Übertragung mit einem Protokoll zu codieren, das nur Text erwartet. Es ist direkt im Wiki- Eintrag.

Russell Troywest
quelle
2

Testen Sie die base128 PHP-Klasse. Codierung und Decodierung mit dem Zeichensatz ISO 8859-1.

GoogleCode PHP-Klasse Base128

Beschlagnahme
quelle
1
Ich wünschte, es würde stattdessen utf-8 verwenden ...
Janus Troelsen
1
Die Basiscodierung hat nichts mit den zugrunde liegenden Daten zu tun. Sie können jede gewünschte Textcodierung verwenden, um Ihren Text / Ihre Daten zu codieren. Er meint damit, dass die Basistabelle ## den ASCII-Zeichensatz ISO 8859-1 als Übersetzung verwendet.
Tschad
1
Es hat etwas mit den zugrunde liegenden Daten zu tun, sobald Sie versuchen, basencodierte Binärdaten in Text einzubetten . Wenn dieser Text in einer anderen Codierung codiert ist, treten Probleme auf.
Stijn de Witt
Es gibt keinen Zeichensatz "ISO 8859-1 ASCII". Das Programm codiert Daten mit 128 verschiedenen druckbaren ISO 8859-1-Zeichen. Es wird in keiner Weise, Form oder Gestalt ASCII verwendet .
Nisse Engström