Que transformações são usadas por sistemas de little-endian para converter dados para pedido de rede?
-
19-08-2019 - |
Pergunta
O que são as transformações subjacentes que são necessários para dados converter em um sistema little-endian em rede byte ordem? Para 2 byte e 4 bytes de dados existem funções bem conhecidas (como htons, ntohl, etc.) para encapsular as mudanças, o que acontece para cordas de dados de 1 byte (se alguma coisa)?
Além disso, Wikipedia implica que little-endian é a imagem espelhada do big-endian, mas se isso fosse verdade, por que precisamos de tratamento específico para dados de 2 e 4 bytes?
O ensaio "On Holy Wars e um apelo para a Paz" parece implicar que há muitos sabores diferentes de little-endian - é um ensaio de idade - é que isso ainda se aplicam? São Byte Order marcadores como os encontrados no início de arquivos de classe Java ainda necessário?
E, finalmente, é o alinhamento de 4 bytes necessário para a ordem de rede-byte?
Solução
Vamos dizer que você tem o texto ASCII "BigE" em uma b
matriz de bytes.
b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'
Esta é a ordem de rede para a cadeia também.
Se ele foi tratado como um número inteiro de 32 bits, que seria
'B' + ('i' << 8) + ('g' << 16) + ('E' << 24)
em uma pequena plataforma endian e
'E' + ('g' << 8) + ('i' << 16) + ('B' << 24)
em uma plataforma endian grande.
Se você converter cada trabalho de 16 bits separadamente, você terá nenhum destes
'i' + ('B' << 8) + ('E' << 16) + ('g' << 24)
que é por isso ntohl
e ntohs
são ambos necessários.
Em outras palavras, swaps ntohs
bytes dentro de um 16-bit curta, e ntohl
inverte a ordem dos quatro bytes de sua palavra de 32 bits.
Outras dicas
funções de manipulação específicas para 2 e 4 bytes de dados de tirar proveito do fato de que existem instruções do processador que operam em tamanhos de dados específicos. Execução de uma função de inversão de 1 byte quatro vezes é certamente menos eficiente do que usando instruções mais amplas para executar as mesmas operações (embora aumentada em escala) em todos os quatro bytes de uma só vez.
1 byte de dados não requer qualquer conversão entre endians (que é uma vantagem de UTF-8 sobre UTF-16 e UTF-32 para codificação de cadeia).
é o alinhamento de 4 bytes necessário para a ordem de rede de byte?
alinhamento específico Não é necessário para bytes passando por cima de uma rede. Seu processador pode exigir um certo alinhamento na memória, mas é até você para resolver a discrepância. A família x86 não costuma fazer tais exigências.
A idéia básica é que todos os tipos de multi-byte tem que ter a ordem de seus bytes revertidas. Um número inteiro de quatro bytes teria bytes 0 e 3 trocados, e os bytes um e dois permutado. Um número inteiro de dois bytes teria bytes 0 e 1 trocados. Um personagem um byte não se trocou.
Existem dois muito importante implicações desta que os não-praticantes e iniciantes nem sempre percebem:
- (ASCII) As cadeias de caracteres não são tocados.
- Não não possível algoritmo cego para byte swap "de dados" genéricos. Você tem que saber o tipo de todos os seus dados e trocar cada item na forma exigida para o seu tipo.