791 Stimmen

Binäre Daten in JSON-String. Etwas Besseres als Base64

があります。 JSON-Format unterstützt von Haus aus keine Binärdaten. Die binären Daten müssen escaped werden, damit sie in ein String-Element (d. h. null oder mehr Unicode-Zeichen in Anführungszeichen mit Backslash-Escapes) in JSON eingefügt werden können.

Eine offensichtliche Methode zur Entschlüsselung von Binärdaten ist die Verwendung von Base64. Base64 ist jedoch mit einem hohen Verarbeitungsaufwand verbunden. Außerdem werden 3 Bytes in 4 Zeichen expandiert, was zu einer Erhöhung der Datengröße um etwa 33 % führt.

Ein Anwendungsfall hierfür ist der Entwurf v0.8 des Spezifikation der CDMI-Wolkenspeicher-API . Sie erstellen Datenobjekte über einen REST-Webservice unter Verwendung von JSON, z.B.

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream",
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}

Gibt es bessere Möglichkeiten und Standardmethoden zur Kodierung von Binärdaten in JSON-Strings?

51 Stimmen

Für den Upload: Sie machen es nur einmal, also ist es keine große Sache. Für den Download: Sie werden überrascht sein, wie gut base64 komprimiert unter gzip Wenn Sie also gzip auf Ihrem Server aktiviert haben, ist das wahrscheinlich auch in Ordnung.

6 Stimmen

Eine weitere würdige Lösung msgpack.org für die Hardcore-Nerds: github.com/msgpack/msgpack/blob/master/spec.md

6 Stimmen

@cloudfeet, Einmal pro Benutzer pro Aktion . Eine sehr große Sache.

14voto

richardtallent Punkte 33425

YEnc könnte für Sie geeignet sein:

http://en.wikipedia.org/wiki/Yenc

"yEnc ist ein Binär-zu-Text-Kodierungsschema für die Übertragung von binären Dateien in [Text]. Es reduziert den Overhead gegenüber früheren US-ASCII-basierten Kodierungsmethoden durch die Verwendung einer 8-Bit Extended ASCII Kodierungsmethode. Der Overhead von yEnc ist oft (wenn jeder Byte-Wert ungefähr mit der gleichen Häufigkeit im Durchschnitt) nur 1-2%, verglichen mit 33%-40% Overhead für 6-Bit-Kodierungsmethoden wie uuencode und Base64. ... Bis 2003 wurde yEnc zum De-facto-Standard-Kodierungssystem für Binärdateien im Usenet."

Allerdings ist yEnc eine 8-Bit-Kodierung, so dass die Speicherung in einer JSON-Zeichenkette die gleichen Probleme wie die Speicherung der ursprünglichen Binärdaten mit sich bringt - die naive Methode bedeutet eine 100%ige Expansion, was schlechter ist als base64.

52 Stimmen

Da eine Menge Leute scheinen immer noch diese Frage zu sehen, möchte ich erwähnen, dass ich nicht glaube, yEnc wirklich hilft hier. yEnc ist eine 8-Bit-Kodierung, so dass die Speicherung in einem JSON-String hat die gleichen Probleme wie die Speicherung der ursprünglichen binären Daten - tun es die naive Art und Weise bedeutet etwa eine 100% Expansion, die schlechter als base64 ist.

0 Stimmen

In Fällen, in denen die Verwendung von Kodierungen wie yEnc mit großen Alphabeten mit JSON-Daten als akzeptabel angesehen wird, fluchtlos kann eine gute Alternative sein, die feste, im Voraus bekannte Gemeinkosten bietet.

12voto

StaxMan Punkte 107669

Es stimmt zwar, dass base64 eine Expansionsrate von ~33% hat, aber es ist nicht unbedingt wahr, dass der Verarbeitungsaufwand wesentlich höher ist: Es hängt wirklich von der JSON-Bibliothek/dem Toolkit ab, das Sie verwenden. Kodierung und Dekodierung sind einfache, geradlinige Operationen, und sie können sogar in Bezug auf die Zeichenkodierung optimiert werden (da JSON nur UTF-8/16/32 unterstützt) - base64-Zeichen sind für JSON-String-Einträge immer Single-Byte. Auf der Java-Plattform gibt es zum Beispiel Bibliotheken, die diese Aufgabe ziemlich effizient erledigen können, so dass der Overhead hauptsächlich auf die erweiterte Größe zurückzuführen ist.

Ich stimme mit zwei früheren Antworten überein:

  • base64 ist ein einfacher, weit verbreiteter Standard, so dass es unwahrscheinlich ist, etwas Besseres speziell für JSON zu finden (base-85 wird von Postscript usw. verwendet; aber die Vorteile sind bestenfalls marginal, wenn man darüber nachdenkt)
  • Komprimierung vor der Kodierung (und nach der Dekodierung) kann je nach den verwendeten Daten sehr sinnvoll sein

11voto

shrewmouse Punkte 4278

Nur um eine weitere Option hinzuzufügen, die wir Dinosaurier-Programmierer auf niedrigem Niveau verwenden...

Eine Methode der alten Schule, die es seit drei Jahren nach Anbeginn der Zeit gibt, ist die Intel HEX Format. Es wurde 1973 eingeführt und die UNIX-Epoche begann am 1. Januar 1970.

  • Ist sie effizienter? Nein.
  • Handelt es sich um einen etablierten Standard? Ja.
  • Ist es für den Menschen lesbar wie JSON? Ja, und viel besser lesbar als die meisten binären Lösungen.

Die json-Datei würde wie folgt aussehen:

{
    "data": [
    ":10010000214601360121470136007EFE09D2190140",
    ":100110002146017E17C20001FF5F16002148011928",
    ":10012000194E79234623965778239EDA3F01B2CAA7",
    ":100130003F0156702B5E712B722B732146013421C7",
    ":00000001FF"
    ]
}

16 Stimmen

Ist sie weniger effizient? Ja.

5 Stimmen

Wir wissen, dass dies weniger platzsparend ist. Ist es weniger zeitsparend? Es ist auf jeden Fall effizienter, wenn es für den Menschen lesbar ist.

9voto

Stefano Fratini Punkte 99

Format "Lächeln

Es ist sehr schnell zu kodieren, dekodieren und kompakt

Geschwindigkeitsvergleich (javabasiert, aber dennoch aussagekräftig): https://github.com/eishay/jvm-serializers/wiki/

Außerdem ist es eine Erweiterung für JSON, die es Ihnen erlaubt, die base64-Kodierung für Byte-Arrays zu überspringen

Smile-kodierte Zeichenketten können gzipped werden, wenn der Platz knapp ist

5 Stimmen

... und der Link ist tot. Dieser hier scheint aktuell zu sein: github.com/FasterXML/smile-format-specification

0 Stimmen

Deshalb ist das Hinzufügen von Links zu Antworten ein schlechter Zug. Fügen Sie der Antwort zumindest einen nützlichen Textausschnitt hinzu :-)

6voto

jsoverson Punkte 1685

Da Sie nach der Möglichkeit suchen, binäre Daten in ein rein textbasiertes und sehr begrenztes Format zu zwängen, denke ich, dass der Overhead von Base64 minimal ist, verglichen mit dem Komfort, den Sie mit JSON zu erhalten hoffen. Wenn Verarbeitungsleistung und Durchsatz ein Anliegen ist, dann müssen Sie wahrscheinlich Ihre Dateiformate zu überdenken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X