Host int64 <-> Network int64
Hallo, ich habe ein kleines Problem, ich möchte gerne 64 Bit Integerzahlen Plattformübergreifend über das Netzwerk, per Sockets, übertragen. Hat jemand vielleicht eine Idee, wie ich am besten die Byteorder von meinem Host int64_t in die Network Byteorder und wieder zurück konvertiere? "htonl" oder "ntohl" sind leider nur 32 Bit-tig. Viele Grüße Bastian
On Tue, 22 Apr 2003 at 18:42 +0200, Bastian Schern wrote:
ich habe ein kleines Problem, ich möchte gerne 64 Bit Integerzahlen Plattformübergreifend über das Netzwerk, per Sockets, übertragen. Hat jemand vielleicht eine Idee, wie ich am besten die Byteorder von meinem Host int64_t in die Network Byteorder und wieder zurück konvertiere? "htonl" oder "ntohl" sind leider nur 32 Bit-tig.
Sowas lässt sich relativ leicht selbst bauen. In /usr/include/byteswap.h findet sich sogar was passendes: #if defined __GNUC__ && __GNUC__ >= 2 /* Return a value with all bytes in the 64 bit argument swapped. */ # define bswap_64(x) __bswap_64 (x) #endif Leider ist das Vorhandensein wohl Plattformabhängig. Was dahinter steckt, sieht man in /usr/include/bits/byteswap.h: #define __bswap_constant_64(x) \ ((((x) & 0xff00000000000000ull) >> 56) \ | (((x) & 0x00ff000000000000ull) >> 40) \ | (((x) & 0x0000ff0000000000ull) >> 24) \ | (((x) & 0x000000ff00000000ull) >> 8) \ | (((x) & 0x00000000ff000000ull) << 8) \ | (((x) & 0x0000000000ff0000ull) << 24) \ | (((x) & 0x000000000000ff00ull) << 40) \ | (((x) & 0x00000000000000ffull) << 56)) # define __bswap_64(x) \ (__extension__ \ ({ union { __extension__ unsigned long long int __ll; \ unsigned long int __l[2]; } __w, __r; \ if (__builtin_constant_p (x)) \ __r.__ll = __bswap_constant_64 (x); \ else \ { \ __w.__ll = (x); \ __r.__l[0] = __bswap_32 (__w.__l[1]); \ __r.__l[1] = __bswap_32 (__w.__l[0]); \ } \ __r.__ll; })) So sieht das immer noch etwas compiler-abhängig aus, aber wenn man zumindest davon ausgehen kann, dass einem ein 64-Bit-Integer-Typ zur Verfügung steht, dann kann man ja ein Makro wie __bswap_constant_64 (mit einem anderen Namen) in seinen eigenen Quellcode einbauen, um es immer zur Verfügung zu haben. Für die Typkennzeichnung (...ull) könnten ggf. bei Verwendung Compiler noch Anpassungen bzw. Fallunterscheidungen nötig sein. Aber falls man einen (nicht zu alten) gcc voraussetzen kann, sollte das so gehen. Eilert -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Eilert Brinkmann -- Universitaet Bremen -- FB 3, Informatik eilert@informatik.uni-bremen.de - eilert@tzi.org http://www.informatik.uni-bremen.de/~eilert/
participants (2)
-
Bastian Schern
-
Eilert Brinkmann