CSAP---大小端位元組序判斷方法
阿新 • • 發佈:2018-12-20
之前在看《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則為小端位元組序