Domanda

In C / C ++, se un valore di carattere wide multibyte (wchar_t) viene trasmesso da un sistema big-endian a un sistema little-endian (o viceversa), uscirà lo stesso valore sull'altro lato? O i byte dovranno essere scambiati?

È stato utile?

Soluzione

Sì, dovrai sostituirli.
I byte verranno recuperati dal trasporto nello stesso ordine in cui sono stati inseriti. Proprio dall'altra parte l'ordinamento di questi byte ha un significato diverso. Quindi è necessario convertirli nella corretta endianness (è una parola?).

Il metodo provato e vero è di convertire in ordine di byte di rete prima del trasporto. Quindi riconvertire all'ordine byte specifico dell'host (dall'ordine byte di rete) alla ricezione.

Un set di funzioni per aiutare con la conversione endian:

ntohs   Convert a 16-bit quantity from network byte order to host byte order
ntohl   Convert a 32-bit quantity from network byte order to host byte order
htons   Convert a 16-bit quantity from host byte order to network byte order
htonl   Convert a 32-bit quantity from host byte order to network byte order

Solo per aggiungere un'altra nota di cautela.
Sistemi diversi usano dimensioni diverse per wchar_t, quindi non assumere sizeof (wchar_t) == 2.

Inoltre ogni host può usare un formato rappresentativo diverso per wchar_t.
Per far fronte a questo, la maggior parte dei sistemi converte il testo in un formato noto per il trasporto (UTF-8 o UTF-16 sono buone scelte). Converte il testo nel formato specifico dell'host dall'altra parte.

Potresti guardare l'icu di IBM che ha tutte queste funzionalità.

Altri suggerimenti

La conversione endiana non è sufficiente e di conseguenza non è necessaria. Sizeof (wchar_t) differisce e quindi anche la codifica. Quindi, è necessario concordare un formato di interscambio. La scelta logica è UTF-8. Ma poiché UTF-8 è orientato ai byte, non hai più problemi di endianness.

Sì, devi eseguire la conversione endian. Definire attentamente il formato di serializzazione, ovvero l'ordine di byte dei dati trasmessi sulla rete o archiviati in un file su disco. Quindi, quando si inviano dati, convertire da formato nativo a filo (può richiedere o meno lo scambio di byte) e, quando si ricevono dati, convertire da filo a formato nativo (di nuovo può richiedere lo scambio di byte o meno). Dovresti scegliere un formato di filo che verrà utilizzato dalla maggior parte dei client per ridurre al minimo la quantità media di scambio di byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top