Wikipedia diz
Os esquemas de codificação Base64 são comumente usados quando há a necessidade de codificar dados binários que precisam ser armazenados e transferidos por mídia projetada para lidar com dados de texto. Isso é para garantir que os dados permaneçam intactos sem modificação durante o transporte.
Mas não é que os dados sejam sempre armazenados / transmitidos em binário porque a memória que nossas máquinas armazenam é binária e depende apenas de como você os interpreta? Portanto, se você codifica o padrão de bits 010011010110000101101110
como Man
em ASCII ou como TWFu
em Base64, acabará armazenando o mesmo padrão de bits.
Se a codificação final é em zeros e uns e todas as máquinas e mídias podem lidar com eles, como importa se os dados são representados como ASCII ou Base64?
O que significa "mídia projetada para lidar com dados de texto"? Eles podem lidar com binário => eles podem lidar com qualquer coisa.
Obrigado a todos, acho que entendo agora.
Quando enviamos dados, não podemos ter certeza de que os dados serão interpretados no mesmo formato que pretendemos. Portanto, enviamos dados codificados em algum formato (como Base64) que ambas as partes entendem. Dessa forma, mesmo que o remetente e o destinatário interpretem as mesmas coisas de maneira diferente, mas como eles concordam com o formato codificado, os dados não serão interpretados incorretamente.
Se eu quiser enviar
Hello
world!
Uma maneira é enviá-lo em ASCII como
72 101 108 108 111 10 119 111 114 108 100 33
Mas o byte 10 pode não ser interpretado corretamente como uma nova linha na outra extremidade. Então, usamos um subconjunto de ASCII para codificá-lo assim
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
que, ao custo de mais dados transferidos para a mesma quantidade de informações, garante que o receptor possa decodificar os dados da maneira pretendida, mesmo que o receptor tenha interpretações diferentes para o restante do conjunto de caracteres.
Respostas:
Seu primeiro erro é pensar que as codificações ASCII e Base64 são intercambiáveis. Eles não são. Eles são usados para diferentes propósitos.
Para entender por que o Base64 era necessário em primeiro lugar, precisamos de um pouco de história da computação.
Os computadores se comunicam em binário - 0s e 1s -, mas as pessoas geralmente desejam se comunicar com dados de formulários mais avançados, como texto ou imagens. Para transferir esses dados entre computadores, é necessário primeiro codificar em 0s e 1s, enviar e depois decodificar novamente. Para tomar o texto como exemplo - existem muitas maneiras diferentes de executar essa codificação. Seria muito mais simples se todos pudéssemos concordar com uma única codificação, mas infelizmente esse não é o caso.
Originalmente, várias codificações diferentes foram criadas (por exemplo, código Baudot ), que usavam um número diferente de bits por caractere até que o ASCII se tornasse um padrão com 7 bits por caractere. No entanto, a maioria dos computadores armazena dados binários em bytes que consistem em 8 bits cada, portanto o ASCII é inadequado para transferir esse tipo de dados. Alguns sistemas até apagariam o bit mais significativo. Além disso, a diferença nas codificações de final de linha entre os sistemas significa que os caracteres ASCII 10 e 13 também foram modificados às vezes.
Para resolver esses problemas, a codificação Base64 foi introduzida. Isso permite que você codifique bytes arbitrários para bytes que são seguros enviar sem serem corrompidos (caracteres alfanuméricos ASCII e alguns símbolos). A desvantagem é que a codificação da mensagem usando Base64 aumenta seu comprimento - a cada 3 bytes de dados são codificados para 4 caracteres ASCII.
Para enviar texto de maneira confiável, você pode primeiro codificar para bytes usando uma codificação de texto de sua escolha (por exemplo, UTF-8) e depois Base64 codifica os dados binários resultantes em uma sequência de texto que é segura para enviar codificada como ASCII. O receptor terá que reverter esse processo para recuperar a mensagem original. É claro que isso requer que o receptor saiba quais codificações foram usadas e essas informações geralmente precisam ser enviadas separadamente.
Historicamente, tem sido usado para codificar dados binários em mensagens de email em que o servidor de email pode modificar as terminações de linha. Um exemplo mais moderno é o uso da codificação Base64 para incorporar dados de imagem diretamente no código-fonte HTML . Aqui é necessário codificar os dados para evitar que caracteres como '<' e '>' sejam interpretados como tags.
Aqui está um exemplo de trabalho:
Desejo enviar uma mensagem de texto com duas linhas:
Se eu enviá-lo como ASCII (ou UTF-8), ficará assim:
O byte 10 está corrompido em alguns sistemas, então podemos codificar com base 64 esses bytes como uma string Base64:
Que quando codificado usando ASCII se parece com isso:
Todos os bytes aqui são bytes seguros conhecidos, portanto, há muito pouca chance de que qualquer sistema corrompa essa mensagem. Posso enviar isso em vez da minha mensagem original e deixar o destinatário reverter o processo para recuperar a mensagem original.
fonte
Codificando Dados Binários em XML
Suponha que você queira incorporar algumas imagens em um documento XML. As imagens são dados binários, enquanto o documento XML é texto. Mas o XML não pode manipular dados binários incorporados. Então como você faz isso?
Uma opção é codificar as imagens na base64, transformando os dados binários em texto que o XML pode manipular.
Ao invés de:
Você faz:
E o analisador XML poderá analisar o documento XML corretamente e extrair os dados da imagem.
fonte
.mht
formato antigo da Microsoft funciona (arquivo html + imagens em um único arquivo).Por que não olhar para o RFC que atualmente define o Base64 ?
O Base64 foi originalmente desenvolvido como uma maneira de permitir que dados binários sejam anexados a emails como parte das Extensões de Correio da Internet com Múltiplos Propósitos.
fonte
A mídia projetada para dados textuais também é, obviamente, binária, mas a mídia textual geralmente usa certos valores binários para caracteres de controle. Além disso, a mídia textual pode rejeitar certos valores binários como não texto.
A codificação Base64 codifica dados binários como valores que só podem ser interpretados como texto na mídia textual e está livre de caracteres especiais e / ou caracteres de controle, para que os dados sejam preservados também na mídia textual.
fonte
Além disso, a mídia valida a codificação de string, portanto, queremos garantir que os dados sejam aceitáveis por um aplicativo de manipulação (e não contenham uma sequência binária representando EOL, por exemplo)
Imagine que você deseja enviar dados binários em um email com codificação UTF-8 - O email pode não ser exibido corretamente se o fluxo de uns e zeros criar uma sequência que não é Unicode válida na codificação UTF-8.
O mesmo tipo de coisa acontece nos URLs quando queremos codificar caracteres não válidos para um URL no próprio URL:
Isso ocorre porque queremos enviar um espaço através de um sistema que achará que o espaço está fedido.
Tudo o que estamos fazendo é garantir que haja um mapeamento 1 para 1 entre uma sequência de bits boa, aceitável e não prejudicial conhecida para outra sequência literal de bits, e que o aplicativo de manipulação não distinga a codificação.
No seu exemplo,
man
pode ser ASCII válido na primeira forma; mas geralmente você pode transmitir valores binários aleatórios (por exemplo, enviar uma imagem em um email):Aqui vemos que uma imagem GIF é codificada em base64 como parte de um email. O cliente de email lê os cabeçalhos e os decodifica. Devido à codificação, podemos ter certeza de que o GIF não contém nada que possa ser interpretado como protocolo e evitamos inserir dados que SMTP ou POP possam achar significantes.
fonte
Base64 em vez de escapar de caracteres especiais
Vou dar um exemplo muito diferente, mas real: escrevo código javascript para ser executado em um navegador. As tags HTML têm valores de ID, mas há restrições sobre quais caracteres são válidos em um ID.
Mas quero que meu ID se refira sem perdas a arquivos no meu sistema de arquivos. Na realidade, os arquivos podem ter todos os tipos de caracteres estranhos e maravilhosos, como pontos de exclamação, caracteres acentuados, til e até emoji! Eu não posso fazer isto:
Suponha que eu queira executar algum código como este:
Eu acho que esse código falhará quando executado.
Com o Base64, posso me referir a algo complicado sem me preocupar com qual idioma permite quais caracteres especiais e quais precisam ser escapados:
Ao contrário do uso de um MD5 ou de alguma outra função de hash, você pode reverter a codificação para descobrir exatamente quais eram os dados realmente úteis.
Eu gostaria de saber sobre a Base64 anos atrás. Eu teria evitado arrancar meu cabelo com '
encodeURIComponent
' estr.replace(‘\n’,’\\n’)
Transferência SSH de texto:
Se você estiver tentando passar dados complexos pelo ssh (por exemplo, um arquivo de ponto para obter personalizações do shell), boa sorte sem o Base 64. É assim que você faria com o Base 64 (eu sei que você pode usar o SCP, mas seriam necessários vários comandos - o que complica as ligações de teclas para o sshing em um servidor):
fonte
Um exemplo de quando achei conveniente foi ao tentar incorporar dados binários em XML . Alguns dos dados binários estavam sendo mal interpretados pelo analisador SAX, porque esses dados podem ser literalmente qualquer coisa, incluindo caracteres especiais XML. A Base64, que codifica os dados na extremidade de transmissão e decodifica-os na extremidade de recebimento, corrigiu esse problema.
fonte
A maioria dos computadores armazena dados no formato binário de 8 bits, mas isso não é um requisito. Algumas máquinas e meios de transmissão podem lidar apenas com 7 bits (ou talvez até menos) por vez. Esse meio interpretaria o fluxo em múltiplos de 7 bits; portanto, se você enviar dados de 8 bits, não receberá o que espera do outro lado. A Base-64 é apenas uma maneira de resolver esse problema: você codifica a entrada em um formato de 6 bits, envia-a pela mídia e a decodifica de volta para o formato de 8 bits na extremidade receptora.
fonte
Além das outras respostas (um tanto demoradas): mesmo ignorando sistemas antigos que suportam apenas ASCII de 7 bits, os problemas básicos do fornecimento de dados binários no modo de texto são:
fonte
Que esses protocolos foram projetados para manipular texto (geralmente, apenas texto em inglês ) em vez de dados binários (como imagens .png e .jpg).
Mas o inverso não é verdadeiro. Um protocolo projetado para representar texto pode tratar indevidamente dados binários que contêm:
Portanto, você não pode simplesmente enviar dados binários através de um protocolo baseado em texto. Você está limitado aos bytes que representam os caracteres ASCII sem espaço e sem controle, dos quais existem 94. A razão pela qual a Base 64 foi escolhida foi o fato de ser mais rápido trabalhar com potências de dois e 64 é o maior que funciona. .
Na Web, pelo menos, eles têm. A maioria dos sites usa UTF-8 .
O problema no Ocidente é que existem muitos softwares antigos que atribuem esse byte = 1 caractere e não podem funcionar com o UTF-8.
O problema no Oriente é o seu anexo a codificações como GB2312 e Shift_JIS.
E o fato de a Microsoft ainda não ter superado a escolha da codificação UTF errada. Se você deseja usar a API do Windows ou a biblioteca de tempo de execução do Microsoft C, você está limitado à codificação UTF-16 ou "ANSI" da localidade. Isso torna doloroso o uso de UTF-8, porque você precisa converter o tempo todo.
fonte
Por que / como usamos a codificação Base64?
Base64 é um dos esquemas de codificação de binário para texto com 75% de eficiência. É usado para que dados binários típicos (como imagens) possam ser enviados com segurança por canais "não limpos em 8 bits" herdados. Nas redes de email anteriores (até o início dos anos 90), a maioria das mensagens de email era texto sem formatação no conjunto de caracteres US-ASCII de 7 bits. Muitos padrões iniciais de protocolo de comunicação foram projetados para funcionar com links de comunicação de "7 bits", não limpos de 8 bits ". A eficiência do esquema é a razão entre o número de bits na entrada e o número de bits na saída codificada. Hexadecimal (Base16) também é um dos esquemas de codificação de binário para texto com 50% de eficiência.
Etapas de codificação Base64 (simplificadas):
fonte
No dia em que a ASCII governava o mundo, lidar com valores não-ASCII era uma dor de cabeça. As pessoas pularam todos os tipos de argolas para transferi-las pela rede sem perder informações.
fonte