Endianness [pt-br]
Achei esse vídeo muito interessante sobre Endianness e o problema de arranjo de bytes na memória.
Imaginem que temos um número de 32bit 12648430
para armazenar na memória.
0x00c0ffee
em hexadecimal
O número contém 4 bytes então dada posições na memória de 1 byte cada temos que colocar cada byte em 4 posições diferentes.
Mas em qual ordem colocar?
00 - c0 - ff - ee
(Começando pelo byte mais significativo)ou
ee - ff — c0 - 00
(Começando pelo byte menos significativo)
Essa decisão determina a “endianness” de um arranjo de bytes.
Imagina que temos que ler um arquivo binário gerado por algum outro software e exibir um número para o usuário.
Simples, não?
A gente sabe de antemão que o número atual escrito é 3256548
, por exemplo.
Aqui vai um código ruby para ler esse arquivo.
bytes = File.read('message.bin', mode: 'rb') # 1
number = bytes.unpack('V') # 2
puts number
- 1: Indicamos para abrir o arquivo em binário bruto;
mode: ‘rb’
- 2: Usamos o método
unpack
passando o formatador‘V’
para interpretar esse array de bytes ordenando como little endian (mais comum).
Rodamos o código… e recebemos:
3836752128
Hmm. Não é o número que esperavamos (3256548). Why? 🤔
Parece que quem escreveu o arquivo ordenou os bytes ao contrário, em Big Endian.
Vamos mudar o formatador para Big Endian então. Dê V
para N
.
Se rodarmos o código vamos receber exatamente o que esperavamos.
3256548
Outros links:
https://www.youtube.com/watch?v=6rNlekLbGjA