# 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: ```c 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: ```c 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 ```bash mkdir build cd build cmake .. make ```