1. 程式人生 > >CSAP---大小端位元組序判斷方法

CSAP---大小端位元組序判斷方法

之前在看《UNIX網路程式設計》這本書時有提到一種方法,利用union的性質,程式碼如下

#include<stdio.h>
int main()
{
    union
    {
        short value;
        char union_bytes[sizeof(short)];
    }test;
    test.value=0x0102;

    //低位地址存放高位資料則為大端位元組序
    if((test.union_bytes[0]==1)&&(test.union_bytes[1]==2))
    {
        printf("big endian\n");
    }
    //小端位元組序
    else if((test.union_bytes[0]==2)&&(test.union_bytes[1]==1))
    {
        printf("little endian\n");
    }
    else
    {
        printf("unknown...\n");
    }
}

在看CSAP時發現了另外一種方法,首先在C語言中一個指標,無論它指向哪種資料型別,它的值都是某個儲存塊的第一個位元組的虛擬地址,例如一個int佔4個位元組,則int指標的值就是第一個位元組的地址,如果把int指標強制轉換為char指標,然後解引用則得到第一個位元組中存放的資料,程式碼如下

 #include <stdio.h>
 #include <unistd.h>
 
 typedef unsigned char *byte_pointer;
 
 void show_bytes (byte_pointer start, int len)
 {
    int i;
    for (i = 0; i < len; i++)
       printf (" %.2x", start[i]);
    printf ("\n");
 }
 
 void show_int (int x)
 {
    show_bytes ((byte_pointer) &x, sizeof(int));
 }
 
//錯誤示例,int*指標解引用直接得到4個位元組也就是整個int的資料
 void show_int_bytes( int *start, int len)
 {
    int i;
    for (i = 0; i < len; i++)
       printf (" %.2x", start[i]);
    printf ("\n");
 }

 int main()
 {  
   int a = 0x01020304;
   show_int(a);
   return 0;
 }

如果輸出結果為:04 03 02 01則為小端位元組序