Guardar un entero en cuatro char sin signo en C
En ocasiones, por motivos del protocolo utilizado en una comunicación, por la forma de acceder a la capa física o por cualquier otra razón similar, no podemos manejar directamente enteros de 4 bytes en nuestro programa, sino que debemos manejar valores de 1 sólo byte. No debemos preocuparnos, al fin y al cabo, podemos enviar un vector de 4 elementos de un tipo de dato que tenga 1 byte, por ejemplo, un carácter sin signo.
Gracias a la operación de desplazamiento de bits y al producto binario, la operación es casi inmediata. Veamos, la idea es guardar un entero de 4 bytes en un vector de 4 elementos de un byte de la siguiente manera:
- Vector[0]: bits del 24 al 31 (parte más significativa)
- Vector[1]: bits del 16 al 23
- Vector[2]: bits del 8 al 15
- Vector[3]: bits del 0 al 7 (parte menos significativa)
Por lo tanto, para almacenar el entero en dicho vector nos limitaremos a hacer lo siguiente:
unsigned char v[4]; v[0] = (n >> 24) & 0xFF; v[1] = (n >> 16) & 0xFF; v[2] = (n >> 8 ) & 0xFF; v[3] = n & 0xFF;
Como véis, además de desplazar, multiplico por todo unos (FF) para asegurarnos de que el entero resultante se queda sólo con el byte que nos importa.
Ahora tenemos en base 256 un número de 4 bytes guardado en 4 cifras. ¿Cómo hacer la operación inversa? Muy simple, si en base 10 hacemos: unidades + decenas x 10 + centenas * 100… en nuestro caso tendríamos:
resultado = v[0] * 16777216 + v[1] * 65536 + v[2] * 256 + v[3];