Se a internet é a rodovia da informação, então o caminho para o e-mail é uma ravina estreita. Somente carrinhos muito pequenos podem passar.
O sistema de transporte de email é projetado apenas para texto ASCII simples. Tentar enviar texto em outros idiomas ou arquivos arbitrários é como pegar um caminhão pela ravina.
Como o caminhão grande atravessa o desfiladeiro?
Então, como você envia um caminhão grande através de uma pequena ravina? Você tem que desmontá-lo em uma extremidade, transportar as peças através da ravina e reconstruir o caminhão a partir das peças na outra extremidade.
O mesmo acontece quando você envia um anexo de arquivo por email. Em um processo conhecido como codificação, os dados binários são transformados em texto ASCII, que pode ser transportado em email sem problemas. No final do destinatário, os dados são decodificados e o arquivo original é recriado.
Um método de codificar dados arbitrários como texto ASCII simples é o Base64. É uma das técnicas empregadas pelo padrão MIME para enviar dados que não sejam texto simples.
Base64 ao salvamento
A codificação Base64 usa três bytes, cada um com oito bits, e os representa como quatro caracteres imprimíveis no padrão ASCII. Isso é feito essencialmente em duas etapas.
O primeiro passo é converter três bytes em quatro números de seis bits. Cada caractere no padrão ASCII consiste em sete bits. O Base64 usa apenas 6 bits (correspondendo a 2 ^ 6 = 64 caracteres) para garantir que os dados codificados sejam imprimíveis e legíveis. Nenhum dos caracteres especiais disponíveis em ASCII é usado.
Os 64 caracteres (daí o nome Base64) são 10 dígitos, 26 caracteres minúsculos, 26 caracteres maiúsculos, bem como '+' e '/'.
Se, por exemplo, os três bytes são 155, 162 e 233, o fluxo de bits correspondente (e assustador) é 100110111010001011101001, que por sua vez corresponde aos valores de 6 bits 38, 58, 11 e 41.
Esses números são convertidos em caracteres ASCII na segunda etapa usando a tabela de codificação Base64. Os valores de 6 bits do nosso exemplo traduzem para a sequência ASCII "m6Lp".
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> m
- 58 -> 6
- 11 -> L
- 41 -> p
Esse processo de duas etapas é aplicado a toda a seqüência de bytes codificados. Para garantir que os dados codificados possam ser impressos adequadamente e não excedam o limite de comprimento de linha de qualquer servidor de correio, os caracteres de nova linha são inseridos para manter os comprimentos de linha abaixo de 76 caracteres. Os caracteres de nova linha são codificados como todos os outros dados.
Resolvendo o Fim do Jogo
No final do processo de codificação, podemos encontrar um problema. Se o tamanho dos dados originais em bytes for um múltiplo de três, tudo funciona bem. Se não for, podemos acabar com um ou dois bytes de 8 bits. Para uma codificação adequada, precisamos exatamente de três bytes.
A solução é acrescentar bytes suficientes com um valor de '0' para criar um grupo de 3 bytes. Dois desses valores são acrescentados se tivermos um byte extra de dados, um é anexado para dois bytes extras.
Naturalmente, esses '0's' não podem ser codificados usando a tabela de codificação abaixo. Eles devem ser representados por um 65º caractere.
O caractere de preenchimento Base64 é '='. Naturalmente, só pode aparecer no final dos dados codificados.
Tabela de codificação Base64
Valor | Caracteres | Valor | Caracteres | Valor | Caracteres | Valor | Caracteres | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | UMA | 16 | Q | 32 | g | 48 | W | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | Eu | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | você | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | eu | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | Eu | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | uma | 42 | q | 58 | 6 | |||
11 | eu | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | você | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |