2009-01-07 48 views

Respuesta

9

Sí, tendrá que cambiarlos.
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. Entonces, necesitas convertirlos al endian-ness correcto (¿es eso una palabra?).

El método probado y verdadero es convertir a orden de bytes de red antes del transporte. A continuación, vuelva a convertir a orden de bytes específico del host (a partir del orden de bytes de red) al recibirlo.

Un conjunto de funciones que ayudan a 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 

sólo para añadir otra nota de precaución.
diferentes sistemas de uso tamaño diferente para wchar_t lo que no asume sizeof (wchar_t) == 2.

Además cada host puede utilizar un formato de representación diferente para wchar_t.
Para ayudar a manejar esta mayoría de los sistemas, convierta el texto a un formato conocido para el transporte (UTF-8 o UTF-16 son buenas opciones). Vuelve a convertir el texto al formato específico del host en el otro extremo.

Puede ver el icu de IBM que tiene toda esta funcionalidad.

+1

Posiblemente mejor que siempre la conversión de todo al orden de bytes de red es incluir un indicador de orden de bytes en su protocolo de red. De esta forma, el servidor puede enviar en su orden de bytes nativo (reduciendo la carga en el servidor) y los clientes pueden determinar si necesitan convertir el mensaje. –

+1

@len: Posiblemente. Pero el servidor no es el cuello de botella. Por lo tanto, un diseño de protocolo prudente descargaría el trabajo a los clientes menos cargados, lo que implicaría que los clientes deberían convertir los datos a un formato de servidor conveniente. Lo cual no implica orden de bytes de red pero implica que un indicador de orden de bytes no es apropiado. –

0

Sí, debe realizar la 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 de formato nativo a cableado (puede o no requerir intercambio de bytes) y al recibir datos, conviértalo de forma inalámbrica a formato nativo (de nuevo puede o no requerir intercambio de bytes). Debe elegir un formato de conexión que la mayoría de los clientes utilizará para minimizar la cantidad promedio de intercambio de bytes.

5

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