Czy serializacja i deserializacja pól struktury do pojedynczych bajtów wystarczy by działało nam wysyłanie danych pomiędzy urządzeniami w których sa różne architektury i różne endianowości czy może potrzeba czegoś jeszcze extra by nasz kod był odporny na wszelkiego rodzaje kombinacje maszyn pomiedzy ktorymi dane mogą być wysyłane/odbierane?
PC arch64bit Big-Endia <---> PC arch32 LittleEndian
PC arch32 LittleEndian <-----> PC arch32 LittleEndian
Tam wiadomo jeszcze przed wysłaniem trzeba użyć funkcji htonl/s a po stronie odbiorczej nthol/s.
Jak serializuję (o ile nie korzystamy z cereala) to robię:
struct A {
int x;
...
};
void serialize(A *wsk)
{
byte[0] = wsk->x & 0xFF;
byte[1] = (wsk->x & 0xFF00) >> 8;
byte[2] = (wsk->x & 0xFF0000) >> 16;
byte[3] = (wsk->x & 0xFF000000) >> 24;
}
void deserialize(unit8_t byte[], int size)
{
wsk->x = byte[0];
wsk->x |= byte[1] << 8;
wsk->x |= byte[2] << 16;
wsk->x |= byte[3] << 24;
}
Ale to chyba powinno wystarczyć, bo jak dam nawet w kodzie zapis:
int x = 0x12345678; //w ramce fizycznej/stronie wirtualnej przestrzeni adresowej procesu wartość jako Little albo BigEndia storowana
....
int z = x; //pobranie komórki pamięci ramki fizycznej i wrzucenie wartości do nowej
to jakby w kodzie zawsze jest endianowość BigEndian. Podejrzewam, że kompilator musi wiedzieć o endianowości i tu jest jakby ta konwersja ukryta, że dla programisty zawsze ten x,z to ma BigEndianowość.
Oggy