Quali trasformazioni vengono utilizzate dai sistemi little-endian per convertire i dati in un ordine di rete?

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

Domanda

Quali sono le trasformazioni sottostanti necessarie per convertire i dati in un sistema little-endian in ordine di byte di rete? Per i dati a 2 byte e 4 byte ci sono funzioni ben note (come hton, ntohl, ecc.) Per incapsulare le modifiche, cosa succede per le stringhe di dati a 1 byte (se non altro)?

Inoltre, Wikipedia implica che little-endian è l'immagine speculare di big-endian, ma se fosse vero perché avremmo bisogno di una gestione specifica per i dati a 2 e 4 byte?

Il saggio " On Holy Wars and a Plea for Peace " sembra implicare che ci sono molti gusti diversi di little-endian - è un vecchio saggio - vale ancora? Sono ancora necessari marcatori dell'ordine dei byte come quelli trovati all'inizio dei file di classe Java?

E infine, l'allineamento a 4 byte è necessario per l'ordine dei byte di rete?

È stato utile?

Soluzione

Supponiamo che tu abbia il testo ASCII " BigE " in un array b di byte.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

Questo è l'ordine di rete anche per la stringa.

Se fosse trattato come un intero a 32 bit, sarebbe

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

su una piccola piattaforma endian e

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

su una piattaforma big endian.

Se convertissi ogni lavoro a 16 bit separatamente, non otterrai nessuno di questi

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

che è il motivo per cui ntohl e ntohs sono entrambi richiesti.

In altre parole, ntohs scambia byte entro un corto di 16 bit e ntohl inverte l'ordine dei quattro byte della sua parola a 32 bit.

Altri suggerimenti

Funzioni di gestione specifiche per dati a 2 e 4 byte sfruttano il fatto che esistono istruzioni per il processore che operano su dimensioni di dati specifiche. L'esecuzione di una funzione di inversione di 1 byte quattro volte è sicuramente meno efficiente rispetto all'utilizzo di istruzioni più ampie per eseguire le stesse operazioni (anche se aumentate in scala) su tutti e quattro i byte contemporaneamente.

I dati a 1 byte non richiedono alcuna conversione tra endian (è un vantaggio di UTF-8 su UTF-16 e UTF-32 per la codifica di stringhe).

  

l'allineamento a 4 byte è necessario per l'ordine dei byte di rete?

Non è necessario alcun allineamento specifico per i byte che passano su una rete. Il tuo processore può richiedere un certo allineamento in memoria, ma sta a te risolvere la discrepanza. La famiglia x86 di solito non fa queste richieste.

L'idea di base è che tutti i tipi multibyte debbano invertire l'ordine dei loro byte. Un numero intero a quattro byte avrebbe scambiato i byte 0 e 3 e scambiati i byte 1 e 2. Un numero intero a due byte avrebbe scambiato i byte 0 e 1. Un carattere a un byte non viene scambiato.

Ci sono due implicazioni molto importanti che i non praticanti e i principianti non sempre realizzano:

  1. (ASCII) Le stringhe di caratteri non vengono toccate.
  2. Esiste no possibile algoritmo cieco per scambiare byte "dati" generici. Devi conoscere il tipo di tutti i tuoi dati e scambiare ogni articolo nel modo richiesto per il suo tipo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top