侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

endian函数用法详解

noerror
2022-11-08 / 0 评论 / 0 点赞 / 19 阅读 / 656 字 / 正在检测是否收录...

endian函数用法详解

endian函数简介

  • 头文件包含
#include <endian.h>
  • 函数定义
uint16_t htobe16(uint16_t  host_16bits );
uint16_t htole16(uint16_t  host_16bits );
uint16_t be16toh(uint16_t  big_endian_16bits );
uint16_t le16toh(uint16_t  little_endian_16bits );
uint32_t htobe32(uint32_t  host_32bits );
uint32_t htole32(uint32_t  host_32bits );
uint32_t be32toh(uint32_t  big_endian_32bits );
uint32_t le32toh(uint32_t  little_endian_32bits );
uint64_t htobe64(uint64_t  host_64bits );
uint64_t htole64(uint64_t  host_64bits );
uint64_t be64toh(uint64_t  big_endian_64bits );
uint64_t le64toh(uint64_t  little_endian_64bits );

endian函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘endian’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <endian.h>

endian函数详细描述

这些函数将整数值的字节编码从当前CPU(“主机”)使用的字节顺序转换为小端字节顺序和大端字节顺序。
每个函数名称中的数字nn 表示该函数处理的整数大小,可以是16、32或64位。
名称形式为“htobenn”的函数从主机字节顺序转换为大端顺序。
名称形式为“htolenn”的函数从主机字节顺序转换为小端顺序。
名称形式为“benntoh”的函数从大端顺序转换为主机字节顺序。
名称形式为“lenntoh”的函数从小端顺序转换为主机字节顺序。

endian函数其他说明

这些函数类似于旧的byteorder (3)系列函数。例如,be32toh ()与ntohl ()相同
byteorder (3)函数的优点是它们是所有UNIX系统上可用的标准函数。另一方面,它们是为在TCP/IP环境中使用而设计的,这意味着它们缺少本页描述的64位和小端变体。

endian函数使用举例

下面的程序显示了将整数从主机字节顺序转换为小端和大端字节顺序的结果。因为主机字节顺序是小端或大端,所以这些转换中只有一个会有效果。当我们在x86-32等小端系统上运行此程序时,我们会看到以下内容:

$ \fB./a.out\fP
x.u32 = 0x44332211
htole32(x.u32) = 0x44332211
htobe32(x.u32) = 0x11223344

Program source&

#include <endian.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
   union {
       uint32_t u32;
       uint8_t arr[4];
   } x;

   x.arr[0] = 0x11;	/* Lowest-address byte */
   x.arr[1] = 0x22;
   x.arr[2] = 0x33;
   x.arr[3] = 0x44;	/* Highest-address byte */

   printf("x.u32 = %#x\en", x.u32);
   printf("htole32(x.u32) = %#x\en", htole32(x.u32));
   printf("htobe32(x.u32) = %#x\en", htobe32(x.u32));

   exit(EXIT_SUCCESS);
}
0

评论区