unsigned long long int in 2 mal uint32_t zerlegen und wieder zusammenstzen in C++

C

Crymes

Guest
Hallo,
ich möchte eine Variable a vom Typ unsigned long long int (64 bit) in zwei uint32_t Variablen a1 und a2 zerlegen, an einen anderen Rechner senden und dort wieder zu b zusammensetzen.
Wie mache ich das am besten ?
Ich kann die Funktionen htonl() und ntohl() zum endian-unabhängigen Übertragen von a1 und a2 nehmen aber stimmt das auch alles wenn ich mit memcpy() die Werte zu b zusammen kopiere ?
 
Theoretisch sollte das schon gehen, das du den 8 Byte-Wert in 2 mit 4 Byte zerlegst.

Ob dann das richtige beim zusammensetzen wieder rauskommt würde ich an deiner Stelle einfach testen.
 
Ich würde das ja entweder per Bitshift machen
a1 = b & 0xffffffff;
a2 = (b >> 32) & 0xffffffff; // das & 0xf.... kann man sich vermutlich schenken, ich würde die paar CPU-Zyklen zur Sicherheit aber opfern
oder mittels Pointer und direktem Speicherzugriff (das wäre dann wohl eher die C-Variante)
Wobei ich, falls vorhanden, uint64_t nutzen würde, da ist dann wnigstens definiert, dass es exakt 64 Bit sind.

Ob am Ziel wieder das Selbe heraus kommt hängt davon ab, ob die ByteOrder auf beiden Rechner identisch ist oder nicht. Je nachdem musst Du am Ziel a1 und a2 vertauschen oder nicht. Wobei ich das nicht per memcpy machen würde, sondern einfach
b = ((uint64_t)a2 << 32) | (uint64_t)a1;
Bei wechselnder Byte-Order musst Du halt a1 und a2 vertauschen.

Ausprobieren ist nur dann eine gute Idee, wenn man Quelle und Ziel kennt und unter eigener Kontrelle hat. ARM kann, je nach Lust und Laune, als Little-Endian oder Big-Endian laufen. Little-Endian ist angeblich der Default, was ich dann unter Android auf einem ARM-Prozessor auch erwarten würde ohne es jemals selber getestet zu haben, Bei Android/Intel wird es zwangsweise so sein, bei Windows/Intel und aktuelleren OS X/Mac OS auf Intel CPUs auch. Wer aber z.B. noch einen Alpha, Motorola oder IA64 Prozessor zu Hause stehen hat, muss umdenken :)
 
Irgendwo muss Apple wohl krampfhaft die Kompatibilität zu den alten System aufrecht halten. Mir wäre aber nicht bekannt, dass man die Intel-Macs (bzw. die Intel-Prozessoren) auf BE umkonfigurieren könnte.
 
Habe es nun hinbekommen, danke für die Antworten !
Es gibt in Linux ein include namens endian.h wo Umwandlungsfunktionen für 64-bit typen enthalten sind.
Folgendes funktioniert: uint64_t a --> in big endian umwandeln --> in uint32_t a1, a2 den vorderen bzw. hinteren Teil von a kopieren, übers Netzwerk übertragen und dort wieder zusammensetzen zu b --> b von big endian in die host-order umwandeln.
 
Zurück