Files
Marshalling/README.md
2022-03-26 17:54:37 +01:00

2.2 KiB
Raw Blame History

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