首页 >后端开发 >C++ >如何用 C 语言实现可移植的 64 位整数字节排序函数?

如何用 C 语言实现可移植的 64 位整数字节排序函数?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 01:33:28409浏览

How to Implement a Portable 64-Bit Integer Byte Ordering Function in C  ?

C 语言中的可移植 64 位整数字节排序函数

问题:

我们能否获得像 htonl 这样的标准函数在 C 中使用 64 位整数,允许转换为网络字节顺序?

答案:

虽然 C 中没有像 htonll 这样明确定义的函数标准库,可以创建可移植的实现。这里有两种方法:

使用动态字节顺序检测:

<code class="cpp">#define htonll(x) ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))</code>
  • 宏 htonll 通过交换将 64 位整数 x 转换为网络字节顺序如果目标架构是小尾数,则为 32 位字。
  • ntohll 执行相反的操作,从网络字节顺序转换为本机字节顺序。

使用预处理器宏:

<code class="cpp">#if __BIG_ENDIAN__
# define htonll(x) (x)
# define ntohll(x) (x)
#else
# define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif</code>
  • 此方法使用基于大多数编译器提供的 __BIG_ENDIAN__ 或 __LITTLE_ENDIAN__ 预处理器符号的预处理器宏定义 htonll 和 ntohll。
  • 如果架构很大- endian(符号定义),函数仅返回输入值,因为不需要字节交换。
  • 对于小端架构,函数执行字节交换,如前面的示例。

以上是如何用 C 语言实现可移植的 64 位整数字节排序函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn