Endianness | Big-endian & Little-endian

Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/17-endianness

In computing, endianness refers to the order of bytes (or sometimes bits) within a binary representation of a number. It can also be used more generally to refer to the internal ordering of any representation, such as the digits in a numeral system or the sections of a date. En computación, endianness hace referencia al orden de los bytes (o en algunos casos bits) dentro de la representación binaria de un número. este termino también puede ser utilizado de manera general para referirse al orden interno de cualquier representación, como los dígitos de un sistema numérico o las diferentes partes de una fecha. https://en.wikipedia.org/wiki/Endianness

Vamos a hablar de bits, bytes y como se organizan dentro de los registros y la memoria. Actualmente estamos habituados a escuchar y leer acerca de procesadores de 64 bits y de que hace no mucho lo más común eran los de 32 bits, también sabemos que hay música de 8 bits que suena a videojuegos “clásicos”; pues todo esto está relacionado con el espacio en bits disponibles para almacenar/transmitir un valor, en el caso de Golang podemos saber el espacio que ocupa una variable basándonos en su tipo:

Veamos la siguiente tabla de equivalencias, comienza con un nibble que es igual a 4 bits y es equivalente a un dígito hexadecimal (0 →F). Un byte está formado por 2 nibbles:

4  BITS    = NIBBLE =      1010 =                A
2  NIBBLES = BYTE   = 1001 1010 =               9A
16 BITS    = WORD   =  2 BYTES  =             FD9A
32 BITS    = DWORD  =  4 BYTES  =         CD01FD9A
64 BITS    = QWORD  =  8 BYTES  = 5D9C00F3CD01FD9A

Ahora, volviendo a la arquitecturas de los procesadores y la memoria, sería poco práctico contar con un espacio de 64 bits y solo almacenar un byte en él, desperdiciando los 24 bits sobrantes; para evitar esta situación, los valores son almacenados de manera secuencial cuando el espacio que ocupa es menor al bloque disponible; existen dos formas de almacenar estos valores y varían en el orden en que cada bloque es colocado en el espacio disponible. Estos dos formatos son conocidos como big-endian y little-endian.

Supongamos que tenemos una secuencia de 8 bytes que son parte de un archivo que estamos procesando, estos bytes los debemos almacenar en una QWORD dentro de la memoria, veamos como serían colocados en cada formato, la secuencia de bytes será: 12 34 56 78 9A BC DE F0

Big-endian

Este formato colocará el primer byte en los 8 bits más significativos de la QWORD, avanzando 8 posiciones y colocando el siguiente cada vez hasta completar los 8 bytes, es entonces cuando comenzará con una nueva QWORD:

Little-endian

Este, en cambio, colocará el primer byte en los 8 bits menos significativos de la QWORD, desplazándose 8 bits a la izquierda cada vez hasta completarlo para cambiar de QWORD.

Algunos algoritmos (de encripción, por ejemplo) requieren que los datos a procesar se encuentren en uno de los dos formatos necesariamente, en caso de que nuestros datos estén en el formato opuesto, siempre podremos recurrir a la librería estándar de Golang para realizar estas operaciones o las transformaciones necesarias.

Implementación en Go

Almacenaremos una cadena de texto dentro de un QWORD utilizando ambos formatos.