Que transformações são usadas por sistemas de little-endian para converter dados para pedido de rede?

StackOverflow https://stackoverflow.com/questions/463416

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?

Foi útil?

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:

  1. (ASCII) As cadeias de caracteres não são tocados.
  2. 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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top