大端:多字節值的大端存儲在該值的起始位置;(老大站排頭爲大)編程
小端:多字節值的小端存儲在該值的起始位置;(老少站排頭爲小)網絡
例如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