为了账号安全,请及时绑定邮箱和手机立即绑定

C ++中的64位ntohl()?

C ++中的64位ntohl()?

慕森卡 2019-11-27 14:29:50
的手册页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库”式方法。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 1722 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信