大端模式和小端模式(大头序和小头序)
大端:多字节值的大端存储在该值的起始位置;(老大站排头为大)
小端:多字节值的小端存储在该值的起始位置;(老小站排头为小)
例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。
在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。
那么,如何通过程序来判断当前主机到底是大端还是小端呢?
| 01 | /*判断大端还是小端, 1:小端  0:大端*/ | 
| 02 | intGetEndian() | 
| 03 | { | 
| 04 |     union | 
| 05 |     { | 
| 06 |         inta; | 
| 07 |         charb; | 
| 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:大端*/ | 
| 02 | intGetEndian() | 
| 03 | { | 
| 04 |     union | 
| 05 |     { | 
| 06 |         shorts; | 
| 07 |         charc[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 |             return0; | 
| 18 |         } | 
| 19 |         elseif(2 == un.c[0] && 1 == un.c[1]) | 
| 20 |         { | 
| 21 |             printf("little-endian\n"); | 
| 22 |             return1; | 
| 23 |         } | 
| 24 |         else | 
| 25 |         { | 
| 26 |             printf("unknown\n"); | 
| 27 |         } | 
| 28 |     } | 
| 29 |     else | 
| 30 |     { | 
| 31 |         printf("sizeof(short) = %d\n", sizeof(short)); | 
| 32 |     } | 
| 33 | 
| 34 |     return0; | 
| 35 | } | 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号