
Supongamos que A es una máquina BE y envía 0x44332211 datos a B, que es LE. De forma predeterminada, A utilizará htonl de 0x44332211, que no es más que 0x44332211.
Ahora, cuando 0x44332211 llega a B, B sabe que es un formato BE, por lo que B cambiará usando la función htonl y lo cambiará a 0x11223344.
¿Qué significa este volteo? Leí este concepto en Internet. ¿Por qué es necesario voltear antes de guardar?
¿Porque en ese caso el valor invertido 0x11223344 se almacenará en LE como 0x44332211, que es diferente de lo que A envía porque B lo interpreta de manera diferente aunque se parecen?
/* Conversión de BE a LE */
Respuesta1
Las funciones htonl()
y ntohl()
en una biblioteca C big endian en realidad no hacen nada (son "no operativas"). De esta manera se puede utilizar el mismo código en máquinas BE y LE; compiladas con la biblioteca C en la máquina LE, esas funciones invertirán los bytes, pero en la máquina BE, los dejarán igual, ya que el orden de bytes de la red es big endian y el host ya es big endian.
En otras palabras, en su ejemplo, la máquina BE A nunca cambia nada. Sólo la máquina LE B lo hace.
Respuesta2
En realidad, no es necesario voltear de una manera específica antes de guardarlo. Es necesario porque el host utiliza el orden little endian, por lo que cuando recibe un número de más de un byte de la red, invierte los bytes para interpretar ese número correctamente. Es necesario realizar esta inversión antes de utilizar los datos para cualquier propósito.
Como analogía, imagínate leyendo un manga impreso en el estilo japonés original (es decir, la página que suele ser la última es en realidad la primera). Si no eres consciente de este hecho y no "le das la vuelta" al libro, simplemente no podrás entender la historia.