2012-10-18 11 views
5

Abbiamo bisogno di supportare 3 piattaforme hardware: Windows (little Endian) e Linux Embedded (grande e piccolo Endian). Il nostro flusso di dati dipende dalla macchina che utilizza e i dati devono essere suddivisi in campi di bit.Supporto Big Endian e Little Endian per l'ordinamento dei byte

Vorrei scrivere una singola macro (se possibile) per astrarre il dettaglio. Su Linux posso usare bswap_16/bswap_32/bswap_64 per le conversioni di Little Endian.

Tuttavia, non riesco a trovare questo nei miei include Visual C++.

Esiste un generico integrato per entrambe le piattaforme (Windows e Linux)?

In caso contrario, cosa posso utilizzare in Visual C++ per eseguire lo scambio di byte (oltre a scrivere da solo - sperando che alcune macchine siano integrate in modo ottimizzato)?

Grazie.

risposta

12

Su entrambe le piattaforme che avete

per short (16bit): htons() e ntohs()

per long (32bit): htonl() e ntohl()

Il mancante htonll() e ntohll() per long long (64bit) potrebbe facilmente essere costruito da quei due. Vedi this implementation for example.

Update-0:

Per l'esempio linkato sopra Simon Richter menziona in un commento, che non deve necessariamente lavorare. La ragione di ciò è la seguente: il compilatore potrebbe introdurre dei byte aggiuntivi da qualche parte nei sindacati usati. Per ovviare a questo problema, i sindacati devono essere imballati. Quest'ultimo potrebbe portare alla perdita di prestazioni.

Quindi, ecco un altro fail-safe approccio per costruire le *ll funzioni: https://stackoverflow.com/a/955980/694576

Update-0.1: non deve essere usato

Da commento s bames53' tendo a concludere il primo esempio linkato sopra con C++, ma solo con C.

Update-1:

Per ottenere l'functionallity delle *ll funzioni su Linux this approach might be the ' best'.

+0

Tali funzioni sono relativamente universali per qualsiasi sistema operativo che comprende reti (ad esempio Internet). Alcuni sistemi operativi più moderni. –

+0

Nota che la loro implementazione di esempio usando 'union' non è garantita per funzionare. –

+0

Sì, hai ragione, i sindacati dovrebbero essere imballati. Grazie per averlo indicato. Si prega di consultare l'aggiornamento alla mia risposta. @ SimonRichter – alk

2

Non sono gli stessi nomi, ma la stessa funzionalità è exist.

2

htons e htonl (e macro simili) sono buoni se si insiste a trattare con il sesso in byte.

Tuttavia, è molto meglio aggirare il problema emettendo i dati in ASCII o simili. Ci vuole un po 'più di spazio, e si trasmette sulla rete un po' più lentamente, ma la semplicità e la protezione futura ne valgono la pena.

Un'altra opzione è quella di separare numericamente i propri int e short.Quindi tu & 0xff e dividi ripetutamente per 256. Questo dà un unico formato su tutte le architetture. Ma ASCII ha ancora il vantaggio perché è più facile eseguire il debug.

+0

Mi piacerebbe farlo, ma non controlliamo la trasmissione. Sono i dati letti da un dispositivo hardware speciale e devono gestire i byte da lì. – user626201

Problemi correlati