【網絡編程】大端模式和小端模式(大頭序和小頭序)

大端:多字節值的大端存儲在該值的起始位置;(老大站排頭爲大)編程

小端:多字節值的小端存儲在該值的起始位置;(老少站排頭爲小)網絡

例如16bit整數:0x0102,其中01即爲多字節值的大端,02即爲多字節值的小端。code

在網絡中傳輸的都是大端序,但具體到某臺主機CPU的實現,則有多是大端序也多是小端序。通常X86是小端。網絡編程

那麼,如何經過程序來判斷當前主機究竟是大端仍是小端呢?it

/*判斷大端仍是小端, 1:小端  0:大端*/
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的低端位於起始位置,即小端,反之爲大端。io

 

我以爲《UNIX網絡編程》(第一卷)給的例子更嚴密一些:class

/*判斷大端仍是小端, 1:小端  0:大端*/
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;
}

2011-12-14  任洪彩 qdurenhongcai@163.comgc

相關文章
相關標籤/搜索