En C/C++, si se transmite un valor de carácter ancho de múltiples bytes (wchar_t) desde un sistema big-endian a un sistema little-endian (o viceversa), obtendrá el mismo valor en el otro lado ? ¿O los bytes tendrán que ser intercambiados?¿Se requiere conversión endian para datos wchar_t?
Respuesta
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.
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.
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.
- 1. Python Slurp Archivo w conversión A/endian
- 2. Conversión de los valores de flotación de big endian a little endian
- 3. ¿Cómo obtener datos pequeños de endian de big endian en C# usando el método bitConverter.ToInt32?
- 4. C# little endian o big endian?
- 5. Little endian Vs Big endian
- 6. wchar_t y codificación
- 7. conversión rápida de datos binarios en Python
- 8. Big-endian vs. little-endian machines
- 9. Confusión en htons- little endian/big endian
- 10. Big endian o Little endian en la red?
- 11. C++: ¿Convierte wchar_t * en BSTR?
- 12. wchar_t puntero
- 13. QChar a wchar_t
- 14. ¿Se requiere HttpWebRequest.GetResponse para completar un POST?
- 15. ¿Se requiere ODP.NET para Oracle 11g Client?
- 16. ¿Cómo se puede copiar eficientemente BSTR a wchar_t []?
- 17. ¿Hay una versión de wchar_t para asprintf?
- 18. wchar_t para UTF-16 en Linux?
- 19. ¿Se requiere ROLLBACK TRANSACTION?
- 20. ¿Se requiere carga lenta para nHibernate?
- 21. NHibernate: No se requiere para NHibernate.Criterion.SqlFunctionProjection
- 22. ¿Se requiere EntityState.Modified para una actualización?
- 23. ¿Se requiere acceso raíz para CUDA?
- 24. ¿Se requiere @DocumentId para Hibernate Search?
- 25. wchar_t vs wint_t
- 26. Wchar_t portátil en C++
- 27. ¿Cuándo se requiere IPPROTO_UDP?
- 28. char vs wchar_t
- 29. Convierte wchar_t en int
- 30. Forma rápida de intercambiar bytes en un array de big endian a little endian en C#
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. –
@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. –