大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)
小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)
例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。
在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。
那么,如何通过程序来判断当前主机到底是大端还是小端呢?
01 |
/*判断大端还是小端, 1:小端 0:大端*/ |
02 |
int GetEndian()
|
03 |
{ |
04 |
union
|
05 |
{
|
06 |
int a;
|
07 |
char b;
|
08 |
} s;
|
09 |
s.a = 0x0001;
|
10 |
return (1 == s.b);
|
11 |
} |
联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。
我觉得《UNIX网络编程》(第一卷)给的例子更严密一些:
01 |
/*判断大端还是小端, 1:小端 0:大端*/ |
02 |
int GetEndian()
|
03 |
{ |
04 |
union
|
05 |
{
|
06 |
short s;
|
07 |
char c[sizeof(short)];
|
08 |
}un;
|
09 |
10 |
un.s = 0x0102;
|
11 |
12 |
if(2 == sizeof(short))
|
13 |
{
|
14 |
if(1 == un.c[0] && 2 == un.c[1])
|
15 |
{
|
16 |
printf("big-endian\n");
|
17 |
return 0;
|
18 |
}
|
19 |
else if(2 == un.c[0] && 1 == un.c[1])
|
20 |
{
|
21 |
printf("little-endian\n");
|
22 |
return 1;
|
23 |
}
|
24 |
else
|
25 |
{
|
26 |
printf("unknown\n");
|
27 |
}
|
28 |
}
|
29 |
else
|
30 |
{
|
31 |
printf("sizeof(short) = %d\n", sizeof(short));
|
32 |
}
|
33 |
34 |
return 0;
|
35 |
} |