这本来是很easy的东东,不过今天看到一段判断主机是大端模式还是小端模式的例子,和以前的常见的例子略有不同,更严密一些,故note一下:
大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)
小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)
例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。
在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。
那么,如何通过程序来判断当前主机到底是大端还是小端呢?
常见方法:
-
-
int GetEndian()
-
{
-
union
-
{
-
int a;
-
char b;
-
} s;
-
s.a = 0x0001;
-
return (1 == s.b);
-
}
联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。
《UNIX网络编程》(第一卷)给的方法:
-
-
int GetEndian()
-
{
-
union
-
{
-
short s;
-
char c[sizeof(short)];
-
}un;
-
-
un.s = 0x0102;
-
-
if(2 == sizeof(short))
-
{
-
if(1 == un.c[0] && 2 == un.c[1])
-
{
-
printf("big-endian\n");
-
return 0;
-
}
-
else if(2 == un.c[0] && 1 == un.c[1])
-
{
-
printf("little-endian\n");
-
return 1;
-
}
-
else
-
{
-
printf("unknown\n");
-
}
-
}
-
else
-
{
-
printf("sizeof(short) = %d\n", sizeof(short));
-
}
-
-
return 0;
-
}
转:http://my.oschina.net/renhc/blog/37130
阅读(1384) | 评论(0) | 转发(0) |