在 C 中搜索“标准”64 位 htonl 函数
在 C 中,htonl 函数用于转换 32 位从主机字节顺序到网络字节顺序的位整数。然而,对于 64 位整数,目前该语言中没有可用的“标准”htonll 函数。
htonll 的可移植实现
为了满足这一需求,程序员设计了 htonll 的可移植实现来处理跨不同平台(包括 Windows、Linux 和 AIX)的 64 位整数字节顺序转换。一种这样的实现是:
<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>
此实现使用 htonl 函数进行 32 位转换,并应用两次,对于 64 位整数的每个 32 位一半各一次,同时还确保交换
确定字节序
由于 C 缺乏在编译时确定字节序的可移植方法,因此上面的实现通过调用在运行时检查它htonl 对整数 1 进行处理。如果结果等于 1,则系统是小端字节序,无需进行字节交换。否则,它是大端字节序,并且实现会交换字节。
使用编译器指令的替代方法
另一种可移植实现使用编译器指令来区分大端字节序和大端字节序小端架构:
<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 指令定义 htonll 和 ntohll 函数,大多数编译器和操作系统都支持该指令。
以上是如何用 C 实现 64 位 htonll 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!