
Suponha que A seja uma máquina BE e esteja enviando 0x44332211 enviando dados para B, que é LE. Por padrão, A usará htonl de 0x44332211, que nada mais é do que 0x44332211.
Agora, quando 0x44332211 chega a B, B sabe que é um formato BE, então B irá inverter usando a função htonl e alterá-lo para 0x11223344.
O que significa essa inversão? Eu li esse conceito na internet. Por que é necessário virar antes de armazenar?
Porque nesse caso o valor invertido 0x11223344 será armazenado em LE como 0x44332211, que é diferente do que A envia porque B o interpreta de maneira diferente, embora sejam parecidos?
/* Conversão de BE para LE */
Responder1
As funções htonl()
e ntohl()
em uma biblioteca C big endian na verdade não fazem nada (elas são "no-op"). Desta forma o mesmo código pode ser usado tanto nas máquinas BE quanto nas LE; compiladas com a lib C na máquina LE, essas funções inverterão os bytes, mas na máquina BE, elas os deixarão iguais, já que a ordem dos bytes da rede é big endian, e o host já é big endian.
Em outras palavras, no seu exemplo, a máquina BE A nunca muda nada. Somente a máquina LE B faz.
Responder2
Na verdade, a inversão não é necessária antes do armazenamento de uma maneira específica. É necessário porque o host usa a ordem little endian, portanto, quando recebe um número maior que um byte da rede, ele inverte os bytes para interpretar esse número corretamente. É necessário fazer essa inversão antes que os dados sejam usados para qualquer finalidade.
Como analogia, imagine-se lendo um mangá impresso no estilo original japonês (ou seja, a página geralmente sendo a última sendo na verdade a primeira). Se você não está ciente desse fato e não “vira” o livro, você simplesmente não consegue entender a história.