Por que apenas base64 em vez de base128 é usado para transmitir dados binários na web? O conjunto de caracteres ASCII tem 128 caracteres que, em teoria, podem representar a base 128, mas apenas a base64, mas não a base128, é usada na maioria dos casos.
encoding
language-agnostic
binary
gmadar
fonte
fonte
Respostas:
O problema é que pelo menos 32 caracteres do conjunto de caracteres ASCII são 'caracteres de controle' que podem ser interpretados pelo terminal receptor. Por exemplo, há o caractere BEL (sino) que faz o terminal de recebimento tocar. Existem os caracteres SOT (Start Of Transmission) e EOT (End Of Transmission) que executam exatamente o que seus nomes implicam. E não se esqueça dos caracteres CR e LF, que podem ter significados especiais em como as estruturas de dados são serializadas / achatadas em um fluxo.
A Adobe criou a codificação Base85 para usar mais caracteres no conjunto de caracteres ASCII, mas AFAIK é protegida por patentes.
fonte
btoa
, que data de 1990, está livre de patentes, e essas certamente estariam expiradas de qualquer maneira.Porque alguns desses 128 caracteres não podem ser impressos (principalmente aqueles que estão abaixo do codepoint 0x20). Portanto, eles não podem ser transmitidos de forma confiável como uma string pelo fio. E, se você for acima do ponto de código 128, poderá ter problemas de codificação devido às diferentes codificações usadas nos sistemas.
fonte
Como já foi dito nas outras respostas, o ponto chave é reduzir o conjunto de caracteres aos imprimíveis . Um esquema de codificação mais eficiente é o basE91 porque ele usa um conjunto de caracteres maior e ainda evita caracteres de controle / espaço em branco na faixa ASCII baixa. A página da web contém uma boa comparação da eficiência de codificação binária vs. base64 vs. basE91 .
Certa vez, limpei a implementação Java. Se as pessoas estiverem interessadas, posso colocá-lo no GitHub.
Atualização : agora está no GitHub .
fonte
Que os primeiros 32 caracteres são caracteres de controle não tem absolutamente nenhuma relevância, porque você não precisa usá-los para obter 128 caracteres. Temos 256 caracteres para escolher, e apenas os primeiros 32 são caracteres de controle. Isso deixa 192 caracteres e, portanto, 128 é completamente possível sem usar caracteres de controle.
Aqui está o motivo: tem que ser algo que tenha a mesma aparência e que você possa copiar e colar, não importa onde. Portanto, deve haver personagens que serão exibidos da mesma forma em qualquer fórum, chat, e-mail e assim por diante. Isso significa que não podemos usar caracteres que um fórum / chat / clientes de e-mail normalmente usam para formatação ou desconsideração. Também deve haver caracteres iguais, independentemente da fonte, idioma e configurações regionais.
Essa é a razão!
fonte
Base64 é comum porque resolve uma variedade de problemas (funciona quase em qualquer lugar que você possa imaginar)
Você não precisa se preocupar se o transporte é 8 bits limpo ou não.
Todos os caracteres da codificação podem ser impressos. Você pode vê- los. Você pode copiá- los e colá- los. Você pode usá-los em URLs (variantes particulares). etc.
Tamanho de codificação fixo. Você sabe que
m
bytes sempre podem ser codificados emn
bytes.Todo mundo já ouviu falar dele - é amplamente suportado, muitas bibliotecas, tão fácil de interoperar.
Base128 não tem todas essas vantagens.
Parece que está limpo de 8 bits - mas lembre-se de que a base64 usa 65 símbolos. Sem um caractere fora de banda, você não pode ter os benefícios de um tamanho de codificação fixo. Se você usar um personagem fora da banda, não poderá mais ser limpo em 8 bits.
Mas nem tudo é negativo.
base128 é mais fácil de codificar / decodificar do que base64 - você apenas usa mudanças e máscaras. Pode ser importante para implementações incorporadas
base128 faz um uso um pouco mais eficiente do transporte do que base64 usando mais bits disponíveis.
As pessoas fazem uso base128 - Eu estou usando-o para alguma coisa agora. Não é tão comum.
fonte
CODES
variável.Não tenho certeza, mas acho que os valores mais baixos (representando códigos de controle ou algo assim) não são transferidos de forma confiável como texto / caracteres dentro de solicitações / respostas HTTP, e os valores acima de 127 podem ser locale / página de códigos / qualquer que seja específico, então não há 128 caracteres diferentes que podem funcionar em todos os navegadores / plataformas.
fonte
esaji está certo. Base64 é usado para codificar dados binários para transmissão usando um protocolo que espera apenas texto. Está bem na entrada do Wiki .
fonte
Verifique a classe PHP base128. Codificação e decodificação com conjunto de caracteres ISO 8859-1.
GoogleCode PHP-Class Base128
fonte