gpt4 book ai didi

c++ - C++中的64位ntohl()?

转载 作者:IT老高 更新时间:2023-10-28 12:32:07 26 4
gpt4 key购买 nike

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

我的问题是我需要将 64 位整数(在我的情况下,这是一个 unsigned long long)从大端转换为小端。现在,我需要进行特定的转换。但是,如果目标平台是大端序时,如果函数(如 ntohl())不会转换我的 64 位值,那就更好了。 (我宁愿避免添加我自己的预处理器魔法来做到这一点)。

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

最佳答案

文档:Linux (glibc >= 2.9) 或 FreeBSD 上的 man htobe64

不幸的是,在 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 库”的方法。

关于c++ - C++中的64位ntohl()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com