【网络编程】大端模式和小端模式(大头序和小头序)

来源:互联网 发布:淘宝新店铺转让价格表 编辑:程序博客网 时间:2024/04/29 07:15

转自:http://my.oschina.net/renhc/blog/37130

大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)

小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)

例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。

在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。

那么,如何通过程序来判断当前主机到底是大端还是小端呢?

01/*判断大端还是小端, 1:小端  0:大端*/
02int 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:大端*/
02int 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}
0 0
原创粉丝点击