2022-03-26 17:54:37 +01:00
2022-03-26 17:54:37 +01:00
2022-03-26 17:54:37 +01:00
2022-03-26 17:54:37 +01:00
2022-03-26 17:54:37 +01:00
2022-03-26 17:54:37 +01:00

Marshalling

Descrizione esercizio

Problema

Stai sviluppando un protocollo di comunicazione per un semplice localizzatore di veicoli. La comunicazione avviene tramite satellite, si ha quindi una larghezza di banda molto bassa e lefficienza è quindi cruciale.

I dati sono organizzati sotto forma di pacchetti di dimensioni 10 byte, con la seguente struttura:

Bit Offset Size in bits Type Name
0 16 unsigned int senderID
16 8 unsigned int packetType
24 16 signed int altitude, in decimetri (0.1 metri)
40 14 signed int longitude, in 0.0000001 gradi
54 14 signed int latitude, in 0.0000001 gradi
68 4 unsigned int flags
72 8 unsigned int ext

Una volta compattato, un pacchetto è rappresentato come array di byte di dimensione 10.

Alla ricezione dei dati, essi vengono scompattati e devono essere rappresentati nel seguente formato:

struct Packet {
    UInt32 senderID;
    UInt32 packetType;
    Int32 altitude;
    Int32 longitude;
    Int32 latitude;
    byte flags;
    byte ext;
};

Task1

Implementa la funzioni marshaling e unmarshaling per i dati sopra definiti.

Le funzioni potrebbero avere la firma seguente:

uint8_t* marshal(Packet* p);
Packet* unmarshal(uint8_t* data);

È possibile modificare le firme del metodo.

Rispettare le seguenti specifiche:

  • Troncamento: se uno qualsiasi dei valori Int32 è troppo grande o troppo piccolo per i campi assegnati, mantieni le cifre più significative. Ad esempio, se laltitudine è 3500.0 m, il valore codificato nel pacchetto è 3276.7 m (0x7FFF). Consultare https://en.wikipedia.org/wiki/Saturation_arithmetic per ulteriori dettagli.

  • Longitudine/Latitudine: solo i 14 bit più significativi devono essere sottoposti a marshalling/unmarshalling.

Come compilare

mkdir build
cd build
cmake ..
make
Description
No description provided
Readme 156 KiB
Languages
C 96.9%
CMake 3.1%