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);
}
评论区