2010-10-18 20 views
20

Quiero usar un WebSocket para transferir datos binarios, pero solo puede usar WebSockets para transferir cadenas UTF-8.Almacenamiento de datos binarios en cadena UTF-8

La codificación con base64 es una opción, pero entiendo que base64 es más conveniente cuando el texto se puede convertir de un formato a otro. En este caso, sé que los datos siempre serán UTF-8, ¿existe una forma mejor de codificar datos binarios en una cadena UTF-8 sin pagar el premium de 33% de tamaño de base64?

Esta pregunta es principalmente académica, ya que el soporte binario probablemente se agregará a WebSocket con el tiempo, y mientras tanto base64 es una alternativa perfectamente cromática.

+3

+1 buena pregunta, con investigaciones anteriores :) – alex

+4

soporte binario en WebSockets ahora son parte de la especificación: http://www.w3.org/TR/websockets/#dom-websocket-send –

Respuesta

12

Puede utilizar una codificación Base-128 en lugar de una codificación Base-64. Eso solo dará como resultado una sobrecarga de 1/7 en oposición a 1/3.

La idea es utilizar todos los puntos de código Unicode que se pueden representar en un solo byte en UTF-8 (0-127). Eso significa que todos los bytes comienzan con un 0 por lo que hay siete bits dejaron para los datos:

0‍xxxxxxx 

que resulta en una codificación donde 7 bytes de entrada se codifican utilizando 8 bytes de salida:

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

Así que la la relación salida/entrada es 8/7.

+1

Creo que implementé lo que describiste. [Aquí] (https://gist.github.com/3881249) es. –

0

Base64 se utiliza mejor cuando las cadenas no admiten blob binario y también cuando la codificación de texto podría estar cambiando; en general, los caracteres utilizados en Base64 son seguros en todos los conjuntos (habiendo estado allí durante mucho tiempo).

Si sabes que siempre es UTF8, ¿podrías codificarlo de una manera que haga uso de los muchos miles de caracteres UTF8?

+4

Creo que esta respuesta es básicamente lo mismo que la pregunta original. – Zach

+0

@Zach Solo estoy tratando de ayudar :) – alex

0

También puede usar Base-91. Sobrecarga del último caso del 23%. Base-128 tiene 1/7 = 14%.