# Base64

Base64 é um método para codificação de dados para transferência na Internet (codificação MIME para transferência de conteúdo). É utilizado frequentemente para transmitir dados binários por meios de transmissão que lidam apenas com texto, como por exemplo para enviar arquivos anexos por e-mail.
É constituído por 64 caracteres ([A-Z],[a-z],[0-9], "/" e "+") que deram origem ao seu nome. O carácter "=" é utilizado como um sufixo especial e a especificação original (RFC 989) definiu que o símbolo "*" pode ser utilizado para delimitar dados convertidos, mas não criptografados, dentro de um stream.
Exemplo de codificação:
* Texto original: Olá, mundo!
* Texto convertido para Base64: T2zDoSwgbXVuZG8h
A codificação Base64 é frequentemente utilizada quando existe uma necessidade de transferência e armazenamento de dados binários para um dispositivo designado para trabalhar com dados textuais. Esta codificação é amplamente utilizada por aplicações em conjunto com a linguagem de marcação XML, possibilitando o armazenamento de dados binários em forma de texto.

## Exemplo

Um fragmento de Leviathan, de Thomas Hobbes, (note a existência de espaços entre as palavras):
Sua representação em caracteres ASCII codificados no formato Base64 MIME:
No fragmento acima, o equivalente em Base64 de Man é TWFu. Codificados em ASCII, os caracteres M, a, e n são armazenados como bytes com valores 77, 97, e 110, cujos valores binários são 01001101, 01100001, e 01101110. Estes 3 valores são concatenados formando um valor de 24 bits, produzindo 010011010110000101101110. Grupos de 6 bits (6 bits formam um máximo de 2$^6$ = 64 valores binários diferentes) são separados da esquerda para a direita (neste caso, há 4 conjuntos nos 24 bits) e convertidos em seus valores correspondentes em Base64.
| Texto | M | M | M | M | M | M | M | M | a | a | a | a | a | a | a | a | n | n | n | n | n | n | n | n |
| ASCII | 77 (0x4d) | 77 (0x4d) | 77 (0x4d) | 77 (0x4d) | 77 (0x4d) | 77 (0x4d) | 77 (0x4d) | 77 (0x4d) | 97 (0x61) | 97 (0x61) | 97 (0x61) | 97 (0x61) | 97 (0x61) | 97 (0x61) | 97 (0x61) | 97 (0x61) | 110 (0x6e) | 110 (0x6e) | 110 (0x6e) | 110 (0x6e) | 110 (0x6e) | 110 (0x6e) | 110 (0x6e) | 110 (0x6e) |
| Binário | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| Valor correspondente (index) | 19 | 19 | 19 | 19 | 19 | 19 | 22 | 22 | 22 | 22 | 22 | 22 | 5 | 5 | 5 | 5 | 5 | 5 | 46 | 46 | 46 | 46 | 46 | 46 |
| Codificado em base64 | T | T | T | T | T | T | W | W | W | W | W | W | F | F | F | F | F | F | u | u | u | u | u | u |
Como ilustrado neste exemplo, três octetos são representados em Base64 como quatro caracteres.
A tabela de equivalência entre valores correspondentes (index) e os caracteres utilizados para codificação:
| Valor | Caractere |
| 0 | A |
| 1 | B |
| 2 | C |
| 3 | D |
| 4 | E |
| 5 | F |
| 6 | G |
| 7 | H |
| 8 | I |
| 9 | J |
| 10 | K |
| 11 | L |
| 12 | M |
| 13 | N |
| 14 | O |
| 15 | P |
| Valor | Caractere |
| 16 | Q |
| 17 | R |
| 18 | S |
| 19 | T |
| 20 | U |
| 21 | V |
| 22 | W |
| 23 | X |
| 24 | Y |
| 25 | Z |
| 26 | a |
| 27 | b |
| 28 | c |
| 29 | d |
| 30 | e |
| 31 | f |
| Valor | Caractere |
| 32 | g |
| 33 | h |
| 34 | i |
| 35 | j |
| 36 | k |
| 37 | l |
| 38 | m |
| 39 | n |
| 40 | o |
| 41 | p |
| 42 | q |
| 43 | r |
| 44 | s |
| 45 | t |
| 46 | u |
| 47 | v |
| Valor | Caractere |
| 48 | w |
| 49 | x |
| 50 | y |
| 51 | z |
| 52 | 0 |
| 53 | 1 |
| 54 | 2 |
| 55 | 3 |
| 56 | 4 |
| 57 | 5 |
| 58 | 6 |
| 59 | 7 |
| 60 | 8 |
| 61 | 9 |
| 62 | + |
| 63 | / |
Quando o número de bytes a ser convertido não for divisível por três (se houver somente um ou dois bytes para compor o último bloco de 24 bits), o seguinte algoritmo é aplicado:
    Adiciona-se o número necessário de bytes com valor zero para que haja 3 bytes. Assim, o bloco fica completo e a conversão é feita normalmente. Se houver somente um byte de entrada significativo, somente os dois primeiros dígitos codificados em base64 (12 bits) são mantidos, e se houverem dois bytes, os três primeiros dígitos codificados (18 bits) são mantidos. O caractere '=' pode ser adicionado para que o último bloco codificado possua 4 caracteres. Assim, quando o último grupo contiver um octeto, os 4 bits menos significativos do grupo final de 6 bits são zero; e quando o último grupo contiver dois octetos, os dois bits menos significativos do grupo de 6 bits são zero.