Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

147
Vistas
Union no puede decodificar la matriz de bytes

El siguiente código no puede decodificar la latitud y la longitud. La salida es: 132, 1, 1645780273, 77276230, 0, -0.000000, 0.000000 , haciendo una conversión incorrecta en los últimos 2 valores de latitud y longitud. Si elimino los primeros 4 valores y uint32_t identifiers; de la estructura obtengo el resultado correcto 132, 1, 1645780273, 77276230, 0, 59.877871, 10.465200

Cualquier ayuda para comprender este comportamiento es muy apreciada.

 #include <stdio.h> #include <string.h> int main() { union { unsigned char bytes[36]; struct{ uint32_t identifier; uint16_t telegram_size; uint16_t telegram_version; uint32_t seconds; uint32_t nanoseconds; uint32_t stat; double latitude; double longitude; }unpack; }telegram; unsigned char values[] = {0x23, 0x4B, 0x4D, 0x42, 0x84, 0x00, 0x01, 0x00, 0x31, 0x9d, 0x18, 0x62, 0x46, 0x24, 0x9b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x3e, 0x2c, 0x11, 0x5e, 0xf0, 0x4d, 0x40, 0xCA, 0x32, 0xC4, 0xB1, 0x2E, 0xEE, 0x24, 0x40}; memcpy(telegram.bytes, values, 36); for (int i=0;i<36;i++){ printf("%02X ", telegram.bytes[i]); } printf("\n%u, %u, %u, %u, %u, %f, %f\n", telegram.unpack.telegram_size, telegram.unpack.telegram_version, telegram.unpack.seconds, telegram.unpack.nanoseconds, telegram.unpack.stat, telegram.unpack.latitude, telegram.unpack.longitude); return 0; }

Actualización: por lo que entendí de los comentarios a continuación, la estructura se ve así: ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Esto tiene que ver con el relleno de estructura.

En términos generales, los miembros de una estructura comienzan en un desplazamiento que es un múltiplo del tamaño de ese miembro para fines de alineación. Debido a esto, hay 4 bytes de relleno entre los miembros stat y latitude para que este último pueda residir en un desplazamiento que es un múltiplo de 8. Eso significa que la estructura es 4 bytes más grande de lo que cree.

Si puede, debe reorganizar los miembros para que se alineen con un desplazamiento natural para que no haya relleno entre los miembros (aunque todavía puede haber relleno al final).

Si esa no es una opción, puede empaquetar la estructura usando un atributo específico del compilador. Si está utilizando gcc, haría lo siguiente:

 struct __attribute__((__packed__)) { uint32_t identifier; uint16_t telegram_size; uint16_t telegram_version; uint32_t seconds; uint32_t nanoseconds; uint32_t stat; double latitude; double longitude; }unpack;

Tenga en cuenta también que en algunas arquitecturas, una lectura o escritura no alineada puede provocar un bloqueo.

over 4 years ago · Santiago Trujillo Denunciar

0

Está asumiendo que la estructura está diseñada con todos los miembros contiguos. Esa no es una suposición segura. Las implementaciones son libres de insertar relleno arbitrario en diseños de estructura entre miembros y después del último miembro. En la práctica, lo harán de una manera que les permita garantizar que todos los miembros puedan alinearse correctamente en la memoria.

En su caso particular, sus doubles de 8 bytes quieren alinearse en límites de 8 bytes. Su implementación garantiza que puedan serlo colocándolos en compensaciones desde el comienzo de la estructura que son múltiplos de 8 bytes. Eso implica insertar cuatro bytes de relleno que de otro modo no se usaría entre stat y latitude , que su inicialización no tiene en cuenta. La estructura general también tendrá un requisito de alineación de 8 bytes y su tamaño total será un múltiplo de 8 bytes.

Eliminar el miembro inicial de cuatro bytes permite que las dos double se alineen sin ningún tipo de relleno, razón por la cual esa variación en su programa funcionó como esperaba.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda