C ++中的64位ntohl()?

的手册页htonl()似乎建议您最多只能将其用于32位值。(实际上,ntohl()是为unsigned long定义的,在我的平台上是32位。我想如果unsigned long为8字节,则适用于64位int)。

我的问题是我需要将64位整数(在我的情况下,这是一个无符号的long long)从big endian转换为little endian。现在,我需要进行特定的转换。但是,ntohl()如果目标平台为大端字节序,那么函数(如)不会转换我的64位值,那就更好了。(我宁愿避免添加自己的预处理器魔术来执行此操作)。

我可以使用什么?我想要一些标准的东西(如果存在的话),但我愿意接受实施建议。我已经看到过去使用联合完成这种类型的转换。我想我可以有一个unsigned long long和一个char [8]的联合。然后相应地交换字节。(显然会在大端字节序的平台上中断)。


慕森卡
浏览 1723回答 3
3回答

慕标5832272

文档:man htobe64在Linux(glibc> = 2.9)或FreeBSD上。不幸的是,在2009年,OpenBSD,FreeBSD和glibc(Linux)并没有很好地协同工作来为此创建一个(非内核API)libc标准。当前,这段简短的预处理器代码:#if defined(__linux__)#&nbsp; include <endian.h>#elif defined(__FreeBSD__) || defined(__NetBSD__)#&nbsp; include <sys/endian.h>#elif defined(__OpenBSD__)#&nbsp; include <sys/types.h>#&nbsp; define be16toh(x) betoh16(x)#&nbsp; define be32toh(x) betoh32(x)#&nbsp; define be64toh(x) betoh64(x)#endif(在Linux和OpenBSD上测试)应该隐藏差异。它为您提供了这4个平台上的Linux / FreeBSD风格的宏。使用示例:&nbsp; #include <stdint.h>&nbsp; &nbsp; // For 'uint64_t'&nbsp; uint64_t&nbsp; host_int = 123;&nbsp; uint64_t&nbsp; big_endian;&nbsp; big_endian = htobe64( host_int );&nbsp; host_int = be64toh( big_endian );这是目前最“标准的C库”式方法。
打开App,查看更多内容
随时随地看视频慕课网APP