Pregunta

En C / C ++, si un valor de carácter ancho de múltiples bytes (wchar_t) se transmite desde un sistema big-endian a un sistema little-endian (o viceversa), ¿obtendrá el mismo valor en el otro ¿lado? ¿O será necesario intercambiar los bytes?

¿Fue útil?

Solución

Sí, deberá intercambiarlos.
Los bytes se recuperarán del transporte en el mismo orden en que se colocaron. Justo en el otro extremo, el orden de estos bytes tiene un significado diferente. Así que necesitas convertirlos a la endiancia correcta (¿es eso una palabra?).

El método probado y verdadero es convertir al orden de bytes de la red antes del transporte. Luego, vuelva a convertir al orden de bytes específico del host (del orden de bytes de la red) en la recepción.

Un conjunto de funciones para ayudar con la conversión 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 para agregar otra nota de precaución.
Los diferentes sistemas usan diferentes tamaños para wchar_t, así que no asuma sizeof (wchar_t) == 2.

Además, cada host puede usar un formato de representación diferente para wchar_t.
Para ayudar a lidiar con esto, la mayoría de los sistemas convierten el texto a un formato conocido para el transporte (UTF-8 o UTF-16 son buenas opciones). Vuelva a convertir el texto al formato específico del host en el otro extremo.

Podrías ver el ICU de IBM, esto tiene toda esta funcionalidad.

Otros consejos

La conversión endiana no es suficiente y, como consecuencia, no es necesaria. Sizeof (wchar_t) difiere, y por lo tanto la codificación también. Por lo tanto, es necesario acordar un formato de intercambio. La elección lógica es UTF-8. Pero como UTF-8 está orientado a bytes, ya no tiene problemas de endianness.

Sí, debe realizar una conversión endian. Defina cuidadosamente su formato de serialización, es decir, el orden de bytes de los datos que se transmiten a través de la red o se almacenan en un archivo de disco. Luego, al enviar datos, convierta del formato nativo al cable (puede requerir o no el intercambio de bytes), y al recibir datos, convierta del cable al formato nativo (nuevamente puede o no requerir el intercambio de bytes). Debería elegir un formato de transferencia que será utilizado por la mayoría de los clientes para minimizar la cantidad promedio de intercambio de bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top