Pregunta

en la Guía del beej a redes hay una sección de cálculo de referencias o embalaje de datos para la serialización en la que describe diversas funciones para el embalaje y desembalaje de datos (int, float, doble .etc).

Es más fácil de usar unión (similar se puede definir para flotador y doble) como se define a continuación y de transmisión integer.pack como versión compacta de integer.i, en lugar de las funciones de empaquetar y desempaquetar.

union _integer{
  char pack[4];
  int i;
}integer;
  1. Puede alguien arrojar algo de luz sobre por qué la unión es una mala elección?

  2. ¿Hay algún método mejor para el embalaje de datos?

¿Fue útil?

Solución

Los diferentes equipos pueden poner los datos de manera diferente. El problema clásico es endianess (en su ejemplo, si el paquete [0] tiene el MSB o LSB). El uso de una unión como esto enlaza los datos a la representación específica en el equipo que lo ha generado.

Si desea ver otras maneras a los datos del ordenar, revisar la Boost serialización y Google protobuf .

Otros consejos

El truco sindicato no se garantiza que funcione, aunque normalmente lo hace. Es perfectamente válido (según la norma) para configurar los datos de char, y después lee 0s al intentar leer el int, o viceversa. Unión fue diseñado para ser un micro-optimización de la memoria, no un reemplazo para la fundición.

En este punto, por lo general, ya sea que envuelve a la conversión de un objeto o uso práctico reinterpret_cast. Ligeramente abultado, o feo ... pero ninguno de esos son cosas necesariamente malo cuando estás datos de embalaje.

¿Por qué no hacer un reinterpret_cast a un char* o una memcpy en un búfer char? Son básicamente la misma cosa y menos confuso.

Tu idea funcionaría, así que a por él si quiere, pero me parece que es un código limpio código feliz. Cuanto más fácil es entender mi trabajo, menos probable es que alguien (como mi yo futuro) lo romperá.

Tenga en cuenta también que sólo POD (datos a secas) tipos se puede colocar en una unión, lo que pone algunas limitaciones en el enfoque de unión que no están allí en una más intuitiva.

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