2009-01-20 7 views
7

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 e 4 byte ci sono funzioni ben note (come htons, ntohl, ecc.) Per incapsulare le modifiche, cosa succede per stringhe di dati a 1 byte (se presenti)?Quali trasformazioni vengono utilizzate dai sistemi little-endian per convertire i dati in ordine di rete?

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 "Sulle guerre sante e un appello per la pace" sembra implicare che ci sono molti diversi sapori di little-endian - è un vecchio saggio - si applica ancora? I marcatori di ordine dei byte come quelli trovati all'inizio dei file di classe Java sono ancora necessari?

Infine, è necessario un allineamento di 4 byte per l'ordine di byte di rete?

risposta

6

Supponiamo di avere 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 per la stringa.

Se è stata trattata come un intero a 32 bit, sarebbe

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

su una piattaforma little endian e

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

su una grande piattaforma endian.

Se si converte ogni opera a 16 bit separatamente, otterreste nessuno di questi

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

è per questo che sono entrambi necessari ntohl e ntohs.

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

0

Funzioni di gestione specifiche per dati a 2 e 4 byte sfruttano il fatto che esistono istruzioni del processore che operano su dimensioni di dati specifiche. Eseguire una funzione di inversione a 1 byte quattro volte è certamente 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.

0

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

0

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

Nessun allineamento specifico è necessario per i byte che attraversano una rete. Il processore potrebbe richiedere un certo allineamento in memoria, ma spetta a te risolvere la discrepanza. La famiglia x86 di solito non fa richieste del genere.

0

L'idea di base è che tutti i tipi di più byte devono avere l'ordine dei loro byte invertiti. Un intero di quattro byte avrebbe i byte 0 e 3 scambiati e i byte 1 e 2 scambiati. Un intero di due byte avrebbe i byte 0 e 1 scambiati. Un carattere di un byte non viene scambiato.

Ci sono due molto importanti implicazioni di questo che i non-praticanti e neofiti non sempre si rendono conto:

  1. (ASCII) Le stringhe di caratteri non vengono toccati.
  2. C'è no possibile algoritmo cieco per scambio di byte "dati" generici. Devi conoscere il tipo di tutti i tuoi dati e scambiare ogni elemento nel modo richiesto per il suo tipo.
Problemi correlati