Quali trasformazioni vengono utilizzate dai sistemi little-endian per convertire i dati in un ordine di rete?
-
19-08-2019 - |
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?
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:
- (ASCII) Le stringhe di caratteri non vengono toccate.
- 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.