¿Por qué no se utiliza base128? [cerrado]

90

¿Por qué solo se usa base64 en lugar de base128 para transmitir datos binarios en la web? El conjunto de caracteres ASCII tiene 128 caracteres que, en teoría, podrían representar la base 128, pero en la mayoría de los casos solo se usa base64 pero no base128.

gmadar
fuente
60
¿Por qué ni siquiera la base 256?
Gumbo
22
Creo que el punto es tener caracteres imprimibles (aunque también hay más de 64 ...)
Felix Kling
29
Creo que la base 128 nos pertenecía hace un tiempo. El equipo asignado a la base de guardia 64 todavía está resistiendo.
Ritch Melton
5
¿Por qué esta pregunta es específica de JavaScript? esto también es válido para la mayoría de los otros idiomas que se utilizan en la web, ¿no es así?
Benedikt Waldvogel
5
@KenRockot: Veo que reconoces que algunos de tus caracteres de 15 bits se codificarían en 3 bytes. Su codificación base-2048 significa empaquetar 11 bits en 2 bytes, lo que genera 5,5 bits por bytes, medio poco menos que base-64.
maaartinus

Respuestas:

105

El problema es que al menos 32 caracteres del conjunto de caracteres ASCII son "caracteres de control" que pueden ser interpretados por el terminal receptor. Por ejemplo, está el carácter BEL (campana) que hace que suene el timbre del terminal receptor. Están los caracteres SOT (Inicio de transmisión) y EOT (Fin de transmisión) que realizan exactamente lo que implican sus nombres. Y no olvide los caracteres CR y LF, que pueden tener significados especiales en cómo se serializan / aplanan las estructuras de datos en una secuencia.

Adobe creó la codificación Base85 para usar más caracteres en el conjunto de caracteres ASCII, pero AFAIK está protegido por patentes.

pepoluan
fuente
7
Base91 parece una buena opción de código abierto: base91.sourceforge.net
Jorge Cevallos
2
Vale la pena considerar que una potencia de 2 bytes se ajusta más fácilmente a los datos y la codificación es más simple. Luego está la portabilidad; cada idioma tiene una codificación base64 y / o una decodificación base64.
Lodewijk
5
Re Base85 y Adobe : la respuesta podría resultar más útil si citara los números de patente y el año de concesión. Si las patentes son un problema, siempre btoa, que data de 1990, está libre de patentes y, sin duda, estas expirarían de todos modos.
agc
65

Porque algunos de esos 128 caracteres no se pueden imprimir (principalmente los que están por debajo del punto de código 0x20). Por lo tanto, no se pueden transmitir de manera confiable como una cadena a través del cable. Y, si supera el punto de código 128, puede tener problemas de codificación debido a las diferentes codificaciones que se utilizan en los sistemas.

driis
fuente
8
Base94 existe aquí en github, utiliza los 94 caracteres ASCII imprimibles: gist.github.com/iso2022jp/4054241
intrepidis
15

Como ya se indicó en las otras respuestas, el punto clave es reducir el juego de caracteres a los imprimibles . Un esquema de codificación más eficiente es basE91 porque usa un conjunto de caracteres más grande y aún evita los caracteres de control / espacios en blanco en el rango ASCII bajo. La página web contiene una buena comparación de la eficiencia de codificación binaria frente a base64 frente a basE91 .

Una vez limpié la implementación de Java. Si la gente está interesada, podría publicarlo en GitHub.

Actualización : ahora está en GitHub .

Benedikt Waldvogel
fuente
Me interesaría la versión de Java
Michael Deardeuff
2
Envió
Benedikt Waldvogel
12

Que los primeros 32 caracteres sean caracteres de control no tiene absolutamente ninguna relevancia, porque no es necesario usarlos para obtener 128 caracteres. Tenemos 256 caracteres para elegir y solo los primeros 32 son caracteres de control. Eso deja 192 caracteres y, por lo tanto, 128 es completamente posible sin usar caracteres de control.

Esta es la razón: tiene que ser algo que se vea igual y que pueda copiar y pegar, sin importar dónde. Por lo tanto, tiene que haber personajes que se mostrarán igual en cualquier foro, chat, correo electrónico, etc. Eso significa que no podemos usar caracteres, que los clientes de un foro / chat / correo electrónico normalmente pueden usar para formatear o ignorar. También debe haber caracteres que sean iguales, independientemente de la fuente, el idioma y la configuración regional.

¡Esa es la razón!

usuario3119289
fuente
7
Los caracteres de control son relevantes porque casi todos ya estaban asumiendo su punto de que debería ser lo más neutral posible en la página de códigos / codificación. Eso necesariamente lo restringe a solo ASCII (7 bits), que es un subconjunto de la mayoría de las codificaciones relevantes. Además, no todo Internet es limpio de 8 bits, y gran parte es ASCII de facto. Sin embargo, vale la pena señalar su punto.
Tim Seguine
7
Solo para agregar: ASCII define solo 128 caracteres. Los caracteres # 128 a # 255 no están definidos en ASCII. Dado que la pregunta hace referencia explícitamente a ASCII y no a "cualquier codificación de 8 bits", todas las respuestas se limitan a los 128 caracteres del conjunto ASCII.
pepoluan
Usando la codificación UTF-8 más común como ejemplo: los bytes de 128 a 196 resultarían inmediatamente en errores de decodificación UTF8; bytes de 196 a 256 implicarían que el siguiente byte también es del mismo carácter, pero si el siguiente byte está por debajo de 128, volvería a producir errores de decodificación UTF8. Sin embargo, casi todos los lenguajes sensibles a la codificación de caracteres harían que la biblioteca base64 tomara cadenas base64 como cadenas seguras para UTF8. No se puede hacer lo mismo con base128 ya que no se puede codificar como una cadena segura para UTF8.
SOFe
10

Base64 es común porque resuelve una variedad de problemas (funciona en casi todos los lugares que pueda imaginar)

  • No necesita preocuparse si el transporte está limpio de 8 bits o no.

  • Todos los caracteres de la codificación se pueden imprimir. Puedes verlos . Puede copiarlos y pegarlos . Puede usarlos en URL (variantes particulares). etc.

  • Tamaño de codificación fijo. Sabes que los mbytes siempre se pueden codificar en nbytes.

  • Todo el mundo ha oído hablar de él: es ampliamente compatible, hay muchas bibliotecas y es muy fácil interoperar con él.

Base128 no tiene todas esas ventajas.

Parece que está limpio de 8 bits, pero recuerde que base64 usa 65 símbolos. Sin un carácter fuera de banda, no puede tener los beneficios de un tamaño de codificación fijo. Si usa un carácter fuera de banda, ya no puede ser limpio de 8 bits.

Sin embargo, no todo es negativo.

  • base128 es más fácil de codificar / decodificar que base64; solo usa turnos y máscaras. Puede ser importante para implementaciones integradas

  • base128 hace un uso un poco más eficiente del transporte que base64 al usar más de los bits disponibles.

Las personas hacen uso base128 - Lo estoy usando para algo ahora. Simplemente no es tan común.

John La Rooy
fuente
También recuerde que los sistemas de correo / noticias y los de su tipo (y también XML) no siempre son amables con los primeros 32 puntos de código (considere CR LF vs LF, por ejemplo), pero por lo demás su respuesta se ve muy bien.
SamB
"esa base64 usa 65 símbolos". => error tipográfico o me perdí algo?
Kikiwa
@Kikiwa, mira esta muestra de Java en wikipedia . Verifique la longitud de la CODESvariable.
John La Rooy
Oh, sí, el carácter de relleno '=' solo al final de la carga útil de codificación, tiene razón, gracias.
Kikiwa
4

No estoy seguro, pero creo que los valores más bajos (que representan códigos de control o algo así) no se transfieren de manera confiable como texto / caracteres dentro de las solicitudes / respuestas HTTP, y los valores por encima de 127 pueden ser locales / páginas de códigos / lo que sea específico, por lo que no hay 128 caracteres diferentes que se puede esperar que funcionen en todos los navegadores / plataformas.

esaj
fuente
3

Esaji tiene razón. Base64 se utiliza para codificar datos binarios para su transmisión mediante un protocolo que solo espera texto. Está justo en la entrada de Wiki .

Russell Troywest
fuente
2

Consulte la clase PHP base128. Codificación y decodificación con juego de caracteres ISO 8859-1.

GoogleCode PHP-Class Base128

seizu
fuente
1
Ojalá usara utf-8 en su lugar ...
Janus Troelsen
1
La codificación base no tiene nada que ver con los datos subyacentes. Puede utilizar cualquier codificación de texto que desee para codificar su texto / datos. Lo que quiere decir es que la tabla de índice Base ## utiliza el juego de caracteres ASCII ISO 8859-1 como traducción.
Chad
1
Tiene algo que ver con los datos subyacentes tan pronto como intenta incrustar datos binarios codificados en base en el texto. Si ese texto está codificado en otra codificación, tendrá problemas.
Stijn de Witt
No existe un conjunto de caracteres "ISO 8859-1 ASCII". El programa codifica datos utilizando 128 caracteres ISO 8859-1 imprimibles diferentes. No usa ASCII , de ninguna manera o forma.
Nisse Engström