Por que o base128 não é usado? [fechadas]


90

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.


60
Por que nem mesmo a base 256?
Gumbo de

22
Acho que o objetivo é ter caracteres imprimíveis (embora também haja mais de 64 ...)
Felix Kling

29
Acho que a base 128 pertenceu a nós há um tempo. A equipe designada para a base de guarda 64 ainda está resistindo.
Ritch Melton

5
por que essa questão é específica do javascript? isso também vale para a maioria das outras linguagens usadas na web, não é?
Benedikt Waldvogel

5
@KenRockot: Vejo que você reconhece que alguns de seus caracteres de 15 bits seriam codificados em 3 bytes. Sua codificação na base 2048 significa empacotar 11 bits em 2 bytes, o que perfaz 5,5 bits por bytes - meio bit menos do que na base 64.
maaartinus

Respostas:


105

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.


7
Base91 parece uma boa opção de código aberto: base91.sourceforge.net
Jorge Cevallos

2
Vale a pena considerar que uma potência de 2 se ajusta aos dados de byte mais prontamente e a codificação é mais simples. Depois, há portabilidade; cada idioma tem uma codificação base64 e / ou uma decodificação base64.
Lodewijk

5
Re Base85 e Adobe : a resposta poderia ser mais útil se citasse os números da patente e o ano de concessão. Se as patentes são um problema, há sempre btoa, que data de 1990, está livre de patentes, e essas certamente estariam expiradas de qualquer maneira.
agc

65

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.


8
Base94 existe aqui no github, ele usa todos os 94 caracteres ASCII imprimíveis: gist.github.com/iso2022jp/4054241
intrepidis

15

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 .


Eu estaria interessado na versão java
Michael Deardeuff


12

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!


7
Os caracteres de controle são relevantes porque quase todo mundo já estava assumindo o seu ponto de que deveria ser o mais neutro de página de código / codificação possível. Isso necessariamente restringe você a apenas (7 bits) ASCII, que é um subconjunto da maioria das codificações relevantes. Além disso, nem toda a Internet é limpa de 8 bits, e grande parte dela é ASCII padrão. Porém, vale a pena enfatizar seu ponto.
Tim Seguine

7
Apenas para adicionar: ASCII define apenas 128 caracteres. Os caracteres # 128 a # 255 não são definidos em ASCII. Visto que a pergunta faz referência explicitamente ao ASCII e não a "qualquer codificação de 8 bits", todas as respostas se limitam aos 128 caracteres do conjunto ASCII.
pepoluan de

Usando a codificação UTF-8 mais comum como exemplo: Bytes de 128 a 196 resultariam imediatamente em erros de decodificação UTF8; bytes de 196 a 256 implicariam que o próximo byte também é do mesmo caractere, mas se o próximo byte for inferior a 128, isso resultará novamente em erros de decodificação UTF8. No entanto, quase todas as linguagens sensíveis à codificação de caracteres teriam a biblioteca base64 usando strings base64 como strings seguras para UTF8. O mesmo não pode ser feito com base128, pois não pode ser codificado como uma string segura para UTF8.
SOFe

10

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 mbytes sempre podem ser codificados em nbytes.

  • 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.


Lembre-se também de que os sistemas de e-mail / notícias e sua espécie (e também XML) nem sempre são gentis com os primeiros 32 pontos de código (considere CR LF vs LF, por exemplo), mas caso contrário, sua resposta parece muito boa.
SamB

"essa base64 usa 65 símbolos." => erro de digitação ou perdi algo?
Kikiwa

@Kikiwa, olhe para este exemplo de java na wikipedia . Verifique o comprimento da CODESvariável.
John La Rooy de

Sim, o caractere de preenchimento '=' apenas no final da carga útil de codificação, você está certo, obrigado.
Kikiwa

4

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.


3

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 .


2

Verifique a classe PHP base128. Codificação e decodificação com conjunto de caracteres ISO 8859-1.

GoogleCode PHP-Class Base128


1
eu gostaria que ele usasse utf-8 ao invés ...
Janus Troelsen

1
A codificação básica não tem nada a ver com os dados subjacentes. Você pode usar qualquer codificação de texto que desejar para codificar seu texto / dados. O que ele quer dizer é que a tabela de índice Base ## usa o conjunto de caracteres ASCII ISO 8859-1 como tradução.
Chade

1
Ele tem algo a ver com os dados subjacentes assim que você tenta incorporar dados binários codificados por base no texto. Se esse texto estiver codificado em outra codificação, você terá problemas.
Stijn de Witt

Não existe um conjunto de caracteres "ISO 8859-1 ASCII". O programa codifica dados usando 128 caracteres ISO 8859-1 imprimíveis diferentes. Não usa ASCII , de forma alguma, forma ou forma.
Nisse Engström
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.