2016-03-19 1 views
0

Je suis en train d'emballer et de déballer des coordonnées GPS dans un tampon de caractères:C: comment faire un empaquetage et un déballage struct dans char buffer?

J'ai un struct gpscoords en tant que tel:

typedef struct { 
    char north; 
    uint16_t lat; 
    uint16_t lat_frac; 
    char east; 
    uint16_t lon; 
    uint16_t lon_frac; 
} gpscoords; 

Comment dois-je emballer et déballer les gpscoords dans le tampon pointé par la variable tampon? Je veux convertir des entiers dans l'ordre du réseau avant de les emballer, mais je le fais à tort ci-dessous:

void pack_gpscoords(gpscoords *pos, char *buffer) { 
    pack_gpscoords(pos, &buffer); 
    memcpy(buffer, pos, sizeof(pos)+1); 
} 

void unpack_gpscoords(gpscoords *pos, char *buffer) { 
    unpack_gpscoords(pos, &buffer); 
    memcpy(pos, buffer, sizeof(buffer)+1); 
} 
+1

Ils sont tous deux conçus pour être des fonctions infiniment récursives, ce qui signifie que la fonction continue à s'appeler jusqu'à ce que le programme se bloque ou que vous terminiez l'exécution. –

+0

Rechercher "sérialisation" et utiliser bitshifts/bitops avec des types indépendants de la mise en œuvre. Ne pas simplement "memcpy" les données. Notez que pour le GPS, vous avez probablement NEMA, qui est un format ASCII. – Olaf

+0

Etes-vous sûr de vouloir reconduire inconditionnellement dans vos fonctions? La descente infinie n'est généralement pas une bonne idée. – EOF

Répondre

2

Vous devez faire le tampon d'octets unsigned char au lieu de char.

Voici comment vous pouvez le faire:

void pack_gpscoords(gpscoords *pos, unsigned char *buffer) { 
    buffer[0] = pos->north; 
    buffer[1] = pos->lat >> 8; 
    buffer[2] = pos->lat & 255; 
    buffer[3] = pps->lat_frac >> 8; 
    buffer[4] = pps->lat_frac & 255; 
    buffer[5] = pos->east; 
    buffer[6] = pos->lon >> 8; 
    buffer[7] = pos->lon & 255; 
    buffer[8] = pps->lon_frac >> 8; 
    buffer[9] = pps->lon_frac & 255; 
} 

void unpack_gpscoords(gpscoords *pos, const unsigned char *buffer) { 
    pos->north = buffer[0]; 
    pos->lat = (buffer[1] << 8) | buffer[2]; 
    pos->lat_frac = (buffer[3] << 8) | buffer[4]; 
    pos->east = buffer[5]; 
    pos->lon = (buffer[6] << 8) | buffer[7]; 
    pos->lon_frac = (buffer[8] << 8) | buffer[9]; 
} 

Notes:

  • l'octet représentation emballé orienté suppose le même ordre des champs. Network order signifie big-endian: le premier octet contient les 8 bits d'ordre supérieur, le second octet contient les 8 bits d'ordre inférieur.
+0

pourquoi y a-t-il 10 emplacements pour le tampon []? – Iona

+0

@Iona: Parce qu'il faut 10 octets pour stocker 2 caractères et 4 16 bits. – chqrlie

+0

donc pour la latitude -51.533, je le veux pour que coord.north = 0; coord.lat = 51; et coord.lat_frac = 553; – Iona