内容
大端小端
大端:高位字节放在低位地址,低位字节放在高位地址
小端:高位字节放在高位地址,低位字节放在低位地址
网络协议指定了通讯字节序–大端
传输多字节顺序的时候才需要考虑大小端,单字节不需要考虑,因为怎么读都不会错误
同一计算机上的不同进程通信时不需要考虑大端还是小端
使用联合体来判断本机是大端还是小端:
union{
short i;
char c[sizeof(short)];
}un;
void main(){
un.i=0x1122;
printf("i:%d \n",un.i);
printf("c1:%x \n",un.c[0]);
printf("c1:%x \n",un.c[0]);
printf("&c1:%p \n",&un.c[0]);
printf("&c2:%p \n",&un.c[1]);
if((un.c[0]==0x11)&&un.c[1]==0x22)
{
printf("大端\n");
}else if((un.c[0]==0x22)&&(un.c[1]==0x11))
{
printf("小端\n");
}
}
字节序反转
下面几个函数就是简单的进行反转,不关心是主机的顺序还是网络的顺序。其中,末尾为l的是转换32位的,末尾为s的是转换16位的。
uint32_t htonl(uint32_t hostint32);
uint16_t htons(uint16_t hostint16);
uint32_t ntohl(uint32_t netint32);
uint16_t ntohs(uint16_t netint16);
例程:
void main(){
int a = 0x1122;
printf("htonl转换前的数据:%08x 转换后的数据:%08x \n",a,htonl(a));
printf("htons转换前的数据:%08x 转换后的数据:%08x \n",a,htons(a));
printf("ntohl转换前的数据:%08x 转换后的数据:%08x \n",a,ntohl(a));
printf("ntohl转换前的数据:%08x 转换后的数据:%08x \n",a,ntohs(a));
}
执行结果: