joachim j. schrieb:
> ich versuche eine Funktion zu schreiben die eine variable beliebigen
> Datentyps in char(8bit) zerlegt und sendet.
>
> meine ide:
Deine Idee ist eine ganz schlechte. Diese funktioniert prinzipiell nur
dann, wenn die Zielmaschine den gleichen Endian (also die Reihenfolge,
wie "höherwertige Typen" als Bytes auf der jeweiligen Maschine
gespeichert wird) besitzen.
Eine portable Möglichkeit ist, sich erstmal auf ein Format (nämlich MSB
first oder LSB first) festzulegen. Anschließend kann man die Werte nach
dieser Vorgabe in einzelne Bytes zerlegen.
Beispiel für LSB first:
Sender:
1 | unsigned char buf[4];
|
2 |
|
3 | unsigned long x = 1234;
|
4 |
|
5 | buf[0] = x & 0xFF;
|
6 | buf[1] = (x >> 8) & 0xFF;
|
7 | buf[2] = (x >> 16) & 0xFF;
|
8 | buf[3] = (x >> 24) & 0xFF;
|
9 |
|
10 | senden (buf, 4);
|
Das Maskieren mit 0xFF könntest Du auch weglassen. Mehr als 8 Bit gehen
in buf[x] sowieso nicht rein.
Empfänger:
1 | unsigned char buf[4];
|
2 | unsigned long x;
|
3 |
|
4 | empfangen (buf, 4);
|
5 |
|
6 | x = ((unsigned long) buf[0] ) | ((unsigned long) buf[1] << 8) |
|
7 | ((unsigned long) buf[2] << 16) | ((unsigned long) buf[3] << 24);
|
Ist zwar Arbeit, aber nur so portabel. Wenn man das nicht explizit so
hinschreiben will wie ich oben, kann man natürlich mit Schleifen und
sizeof() arbeiten. Kommt darauf an, wieviele verschiedene Typen von
Variablen Du hast, welche verschickt werden sollen.