我们一般将“endian”翻译成“字节序”,将 Big-Endian 和
Little-Endian 称作“大端格式”和“小端格式”。
字节序是指多字节数据的存储顺序,在设计计算机系统的时候,有两种处理内存中数据的方法:大端格式、小端格式。
小端格式(Little-Endian):将低位字节数据存储在低地址。
大端格式(Big-Endian):将高位字节数据存储在低地址。
举个简单的例子,对于整形 0x12345678,它在大端格式和小端格式的系统中,分别如下图所示的方式存放:
下面例子为确定主机的字节序:
#include <stdio.h> int main(int argc, char *argv[]) { unsigned int a = 0x12345678; unsigned char *p = (unsigned char *)&a; //只取一个字节 if(0x12 == *p){ printf("Big-Endian\n"); }else if(0x78 == *p){ printf("Little-Endian\n"); } return 0; }
以下接口所需头文件:#include <arpa/inet.h>
uint32_t htonl(uint32_t hostint32);
功能:
将 32 位主机字节序数据转换成网络字节序数据
参数:
hostint32:需要转换的 32 位主机字节序数据,uint32_t 为 32 为无符号整型
返回值:
成功:返回网络字节序的值
uint16_t htons(uint16_t hostint16);
功能:
将 16 位主机字节序数据转换成网络字节序数据
参数:
hostint16:需要转换的 16 位主机字节序数据,uint16_t,unsigned short int
返回值:
成功:返回网络字节序的值
测试示例:
#include <stdio.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int a = 0x01020304; short int b = 0x0102; printf("htonl(0x%08x) = 0x%08x\n", a, htonl(a)); printf("htons(0x%04x) = 0x%04x\n", b, htons(b)); return 0; }运行结果如下:
uint32_t ntohl(uint32_t netint32);
功能:
将 32 位网络字节序数据转换成主机字节序数据
参数:
netint32:待转换的 32 位网络字节序数据,uint32_t,unsigned int
返回值:
成功:返回主机字节序的值
uint16_t ntohs(uint16_t netint16);
功能:
将 16 位网络字节序数据转换成主机字节序数据
参数:
netint16:待转换的 16 位网络字节序数据,uint16_t,unsigned short int
返回值:
成功:返回主机字节序的值
int inet_pton(int family, const char *strptr, void *addrptr);
功能:
将点分十进制数串转换成 32 位无符号整数
参数:
family:协议族( AF_INET、AF_INET6、PF_PACKET 等 ),常用 AF_INET
strptr:点分十进制数串
addrptr:32 位无符号整数的地址
返回值:
成功返回 1 、 失败返回其它
测试示例:
#include <stdio.h> #include <arpa/inet.h> int main() { char ip_str[]="172.20.223.75"; unsigned int ip_uint = 0; unsigned char *ip_p = NULL; inet_pton(AF_INET,ip_str,&ip_uint); printf("in_uint = %d\n",ip_uint); ip_p = (char *)&ip_uint; printf("in_uint = %d,%d,%d,%d\n",*ip_p,*(ip_p+1),*(ip_p+2),*(ip_p+3)); return 0; }运行结果如下:
const char *inet_ntop( int family,
const void *addrptr,
char *strptr,
size_t len );
功能:
将 32 位无符号整数转换成点分十进制数串
参数:
family:协议族( AF_INET、AF_INET6、PF_PACKET 等 ),常用 AF_INET
addrptr:32 位无符号整数
strptr:点分十进制数串
len:strptr 缓存区长度
len 的宏定义
#define INET_ADDRSTRLEN 16 // for ipv4
#define INET6_ADDRSTRLEN 46 // for ipv6
返回值:
成功:则返回字符串的首地址
失败:返回 NULL
测试示例:
#include <stdio.h> #include <arpa/inet.h> int main() { unsigned char ip[] = {172,20,223,75}; char ip_str[16] = "NULL"; inet_ntop(AF_INET,(unsigned int *)ip,ip_str,16); printf("ip_str = %s\n",ip_str); return 0; }运行结果如下:
原文地址:http://blog.csdn.net/tennysonsky/article/details/45045549