Por que a inversão é feita nos dados do Big endian antes de armazenar no LE?

Por que a inversão é feita nos dados do Big endian antes de armazenar no LE?

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.

informação relacionada