2.2 KiB
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 l’efficienza è 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 l’altitudine è 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