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

https://www.youtube.com/watch?v=6rNlekLbGjA

https://www.youtube.com/watch?v=ggz24JKI0VQ

https://www.youtube.com/watch?v=LxvFb63OOs8