最近要重新研究linux网络编程,首先都遇到这个问题,记录复习下吧~
本文转自:http://blog.chinaunix.net/uid-23069658-id-3271110.html
大小端字节序
小端字节序:little-endian,将低字节存放在内存的起始地址;
大端字节序:big-endian,将高字节存放在内存的起始地址。
例如,数字index=0x11223344,在大小端字节序方式下其存储形式为:
上图一目了然的可以看出大小端字节序的区别。
程序实现:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
int main()
{
printf("short int=%d,char=%d\r\n",sizeof(short int),sizeof(char));
short int x;
char x1,x2;
x = 0x1122;
x1 = ((char *)&x)[0]; //低地址
x2 = ((char *)&x)[1]; //高地址
printf("x1=%x\n",x1);
printf("x2=%x\n",x2);
if(x1 ==0x22)
{
//小端字节序:little-endian,将低字节存放在内存的起始地址;
//大部分电脑都是小端模式
printf("小端字节序\n");
}else
{ //大端字节序:big-endian,将高字节存放在内存的起始地址。
printf("大端字节序\n");
}
system("pause");
return 0;
}
在windows 32位编译器上,编译结果:
short int=2,char=1
x1=22
x2=11
小端字节序
总结:
网络字节顺序采用big endian方式。
X86系列CPU都是小端little-endian字节序,即低字节存低位,高字节存高位。
补充:
参考《Unix环境编程》,在windows和ubuntu环境下大小端识别均为小端模式。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
union{
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
if( sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1]== 2) //将低序字节存储在起始地址,为小端字节序
printf("big-endian\n");
else if(un.c[0] == 2 && un.c[1]== 1) //将高序字节地址存储在起始地址,成为大端字节序
printf("little-endian\n");
}
else
{
printf("sizeof(short)= %d\n",sizeof(short));
}
return 0;
}