Question

En C / C ++, si une valeur de caractère large de plusieurs octets (wchar_t) est transmise d'un système big-endian à un système little-endian (ou inversement), la même valeur sera-t-elle affichée sur l'autre côté? Ou les octets devront-ils être échangés?

Était-ce utile?

La solution

Oui, vous devrez les échanger.
Les octets seront extraits du transport dans l'ordre où ils ont été placés. À l'autre extrémité, l'ordre de ces octets a un sens différent. Donc, vous devez les convertir en la bonne finalité (est-ce un mot?).

La méthode éprouvée consiste à convertir en ordre d'octet réseau avant le transport. Reconvertissez ensuite en ordre d'octet spécifique à l'hôte (à partir de l'ordre d'octets réseau) à la réception.

Un ensemble de fonctions d'aide à la conversion 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

Juste pour ajouter une autre note de prudence.
Différents systèmes utilisent différentes tailles pour wchar_t, ne supposez donc pas sizeof (wchar_t) == 2.

De plus, chaque hôte peut utiliser un format de représentation différent pour wchar_t.
Pour résoudre ce problème, la plupart des systèmes convertissent le texte en un format de transport connu (UTF-8 ou UTF-16 sont de bons choix). Reconvertir le texte au format spécifique à l'hôte à l'autre extrémité.

Vous pouvez regarder sur l'icu d'IBM qui a toutes ces fonctionnalités.

Autres conseils

La conversion Endian n'est pas suffisante et, par conséquent, n'est pas nécessaire. Sizeof (wchar_t) diffère et donc l'encodage aussi. Par conséquent, vous devez vous mettre d’accord sur un format d’échange. Le choix logique est UTF-8. Mais comme UTF-8 est orienté octet, vous n’avez plus de problèmes d’endianisme.

Oui, vous devez effectuer une conversion Endian. Définissez avec soin votre format de sérialisation, c’est-à-dire l’ordre des octets de données transmises sur le réseau ou stockées dans un fichier sur disque. Ensuite, lors de l’envoi de données, convertissez du format natif au format filaire (peut nécessiter ou non l’échange d’octets) et lors de la réception de données, effectuez la conversion du format filaire au format natif (encore une fois, il peut nécessiter ou non l’échange d’octets). Vous devez choisir un format filaire qui sera utilisé par la majorité des clients afin de minimiser le nombre moyen d’échanges d’octets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top