的手册页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]的联合。然后相应地交换字节。(显然会在大端字节序的平台上中断)。
3 回答
慕标5832272
TA贡献1966条经验 获得超4个赞
文档:man htobe64在Linux(glibc> = 2.9)或FreeBSD上。
不幸的是,在2009年,OpenBSD,FreeBSD和glibc(Linux)并没有很好地协同工作来为此创建一个(非内核API)libc标准。
当前,这段简短的预处理器代码:
#if defined(__linux__)
# include <endian.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__)
# include <sys/endian.h>
#elif defined(__OpenBSD__)
# include <sys/types.h>
# define be16toh(x) betoh16(x)
# define be32toh(x) betoh32(x)
# define be64toh(x) betoh64(x)
#endif
(在Linux和OpenBSD上测试)应该隐藏差异。它为您提供了这4个平台上的Linux / FreeBSD风格的宏。
使用示例:
#include <stdint.h> // For 'uint64_t'
uint64_t host_int = 123;
uint64_t big_endian;
big_endian = htobe64( host_int );
host_int = be64toh( big_endian );
这是目前最“标准的C库”式方法。
- 3 回答
- 0 关注
- 1711 浏览
添加回答
举报
0/150
提交
取消