2010-10-18 14 views
20

Ich möchte WebSocket verwenden, um binäre Daten zu übertragen, aber Sie können nur WebSockets verwenden, um UTF-8-Zeichenfolgen zu übertragen.Speichern von Binärdaten in UTF-8 Zeichenfolge

Codierung mit base64 ist eine Option, aber nach meinem Verständnis ist base64 am wünschenswertesten, wenn Ihr Text von einem Format in ein anderes Format konvertiert werden kann. In diesem Fall weiß ich, dass die Daten immer UTF-8 sind. Gibt es also eine bessere Möglichkeit, binäre Daten in einer UTF-8-Zeichenfolge zu codieren, ohne base64s 33% ige Prämie zu zahlen?

Diese Frage ist meist akademisch, da WebSocket wahrscheinlich mit einer binären Unterstützung erweitert wird, und base64 ist in der Zwischenzeit eine durchaus cromulente Alternative.

+3

+1 gute Frage, mit der bisherigen Forschung :) – alex

+4

binäre Unterstützung in WebSockets sind jetzt Teil der Spezifikation: http://www.w3.org/TR/websockets/#dom-websocket-send –

Antwort

12

Sie könnten eine Base-128-Codierung anstelle einer Base-64-Codierung verwenden. Das ergibt nur einen Overhead von 1/7 gegenüber 1/3.

Die Idee ist, alle Unicode-Codepunkte zu verwenden, die in einem einzigen Byte in UTF-8 (0-127) dargestellt werden können. Das bedeutet, dass alle Bytes beginnen mit einem 0 so gibt es sieben Bits für die Daten links:

0‍xxxxxxx 

, die in einem Codierungs Ergebnisse, bei denen 7 Eingangsbytes codiert werden, unter Verwendung von 8 Ausgangsbytes:

input: aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg 
output: 0aaaaaaa 0abbbbbb 0bbccccc 0cccdddd 0ddddeee 0eeeeeff 0ffffffg 0ggggggg 

So ist die Verhältnis von Ausgabe zu Eingabe ist 8/7.

+1

Ich denke, ich habe implementiert, was Sie beschrieben. [Hier] (https://gist.github.com/3881249) ist es. –

0

Base64 wird am besten verwendet, wenn die Zeichenketten kein Binär-Blob unterstützen und auch wenn sich die Textkodierung ändern könnte - die in Base64 verwendeten Zeichen sind in allen Zeichensätzen sicher (seit langer Zeit).

Wenn Sie wissen, dass es immer UTF8 ist, können Sie es so codieren, dass es die vielen tausend UTF8-Zeichen verwendet?

+4

Ich denke, diese Antwort ist im Grunde das gleiche wie die ursprüngliche Frage. – Zach

+0

@Zach Nur versuchen zu helfen :) – alex

0

Sie können Base-91 auch verwenden. Worst Case Overhead von 23%. Base-128 hat 1/7 = 14%.