ENCODING

Existem diversas formas de se representar dados binários. Por exemplo, considere a string binária

0100 0101 0111 0101 0010 0000 0110 0001 0110 1101 0110 1111 0010 0000 0110 0011 0111 0010 0111 1001 0111 0000 0111 0100 0110 1111 0010 0001

Algumas formas de representar esta string são:

Hexadecimal

Em hexadecimal (ou hex, ou base 16) representamos a string em blocos de 4 bits, utilizando os algarismos de 0 a 9 e as letras de ‘a’ a ‘f’, de maneira que ‘a’ = 10, ‘b’ = 11, …, ‘f’ = 15.

Separando em blocos de 4 bits e obtendo os caracteres equivalentes, temos

0100 = 4
0101 = 5
0111 = 7
.
.
.
1111 = 15 ~ f
0010 = 2
0001 = 1

E, assim, obtemos a string hexadecimal

457520616d6f2063727970746f21

É bastante comum representar uma string hex com um ‘x’, como por exemplo 0x457520616d6f2063727970746f21 ou \x457520616d6f2063727970746f21.

No Python, cada byte de um objeto bytes é printado como dois caracteres hexadecimais, exceto quando o ASCII equivalente é printável.

Base64

Em Base64, representamos a string em blocos de 6 bits, utilizando o alfabeto maiúsculo, mais o alfabeto minúsculo, mais os algarismos de 0 a 9, mais os símbolos ‘+’ e ‘/’ (26 + 26 + 10 + 2 = 64).

Assim, temos a equivalência ‘A~0’, …, ‘Z~25’, ‘a~25’, …, ‘z~51’, ‘0~52’, …, ‘9~61’, ‘+~62’, ‘/~63’.

Além disso, o símbolo ‘=’ é usado como Padding, de forma que a string em Base64 sempre tenha um comprimento múltiplo de 4. Isso é feito para que haja uma boa correspondência entre a string em Base64 e a representação em bytes da string. De fato, o \(4\cdot6 = 24 = 3\cdot8\) é o primeiro múltiplo de \(6\) divisível por \(8\). Dessa maneira, 4 carácteres Base64 correspondem a 3 bytes.

Separando em blocos de 6 bits, temos:

010001 010111 010100 100000 011000 010110 110101 101111 001000 000110 001101 110010 011110 010111 000001 110100 011011 110010 0001

Como o tamanho da string não é um múltiplo de 6, adicionamos um zero padding ao fim do último bloco:

010001 010111 010100 100000 011000 010110 110101 101111 001000 000110 001101 110010 011110 010111 000001 110100 011011 110010 000100

Obtendo os caracteres correspondentes a cada bloco, temos:

010001 = 17 ~ R
010111 = 23 ~ X
011101 = 29 ~ d
.
.
.
011011 = 27 ~ b
110010 = 50 ~ y
000100 = 4  ~ E

Temos apenas 19 caracters, então um caratcter de padding deve ser adicionado para que o comprimento seja múltiplo de 4. Assim, obtemos a string Base64

RXUgYW1vIGNyeXB0byE=

Um uso comum de Base64 é no formato PEM (Privacy-Enhanced Mail), onde a estrutura de um certo dado é descrita em ASN.1 no formato DER (Distinguished Encryption Rules) e então codificadas em Base64. Por exemplo, uma chave do 7 RSA pode ser formatada como

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAzvKDt+EO+A6oE1LItSunkWJ8vN6Tgcu8Ck077joGDfG2NtxD
4vyQxGTQngr6jEKJuVz2MIwDcdXtFLIF+ISX9HfALQ3yiedNS80n/TR1BNcJSlzI
.
.
.
f6/QCkmOxPC868qhOMgSS48L+TMKmQNQSm9b9oy2ILlLA0KDsX5O/Foyiz1scwr7
nh6tZ+tVQCRvFviIEGkaXdEiBN4eTbcjfc5md/u9eA5N21Pzgd/G
-----END RSA PRIVATE KEY-----

ASCII

O ASCII (American Standard Code for Information Interchange) foi a codificação mais importante a ser estabelecida na comunicação eletrônica. Em ASCII, cada bloco de 7 bits é interpretado como um símbolo ou caracter de comando.

Como esses caracteres de comando não podem ser impressos, ASCII não serve para codificação de informação binária arbitrária, mas sim para a codificação de mensagens.

Unicode

O Unicode é uma codificação derivada do ASCII que se tornou a codificação mais utilizada na comunicação eletrônica moderna. Ela possui diversos formatos diferentes, sendo que os mais importantes desses são os formados UTF-8, UTF-16 e UTF-32, cada um com tamanho de bloco de 8, 16 e 32 bits, respectivamente.

Os formatos UTF tem como primeiros 128 caracteres os mesmos que o ASCII, de maneira que as duas codificações sejam compatíveis.1

Em UTF-8, a string binária é

Eu amo crypto!

  1. Desde que estes caracteres ASCII sejam lidos apropriadamente (i.e. de 7 em 7 bits).↩︎

© 2025 Luã Jaz. Todos os direitos reservados.