一、字节序内存分布图
小端LE:低位(数据)单元存放在低位(存储)单元,如Windows、Linux、x86的CPU;
大端BE:低位(数据)单元存放在高位(存储)单元,如IOS、PowerPC处理器;
1 int main() 2 { 3 struct A 4 { 5 unsigned int uiData; 6 unsigned short usData[2]; 7 unsigned char ucData[4]; 8 }; 9 struct A a = {0x01020304, {0x0102, 0x0304}, {0x01, 0x02, 0x03, 0x04}}; 10 11 printf("%#010x\n", *(((unsigned int *)(&a)) + 0));//0x01020304 12 printf("%#010x\n", *(((unsigned int *)(&a)) + 1));//0x03040102 13 printf("%#010x\n", *(((unsigned int *)(&a)) + 2));//0x04030201 14 return 0; 15 }
注意问题:
1、主机字节序问题只发生在int、short、char等基本数据间,基本数据内部不存在这种问题。
2、网络字节序问题不同于主机字节序,任何数据都以Byte传递,一定要考虑字节序问题。
二、主机字节序检测方法
网络字节序为big endian。
1 int main() 2 { 3 union 4 { 5 unsigned short usData; 6 unsigned char ucData[2]; 7 }a; 8 a.usData = 1; 9 if(a.ucData[0] == 1) 10 { 11 printf("little\n"); 12 } 13 else 14 { 15 printf("big\n"); 16 } 17 return 0; 18 }
三、关于字节序的平台移植方法
例1、
1 #include <endian.h>//具体文件自己找 2 3 #if (BYTE_ORDER == BIG_ENDIAN) 4 5 #define htonl(i) (i) 6 #define ntohl(i) (i) 7 8 #else /*BYTE_ORDER*/ 9 10 #define htonl(i) ( 11 (((i)&0xFF000000) >> 24) + 12 (((i)&0x00FF0000) >> 8) + 13 (((i)&0x0000FF00) << 8) + 14 (((i)&0x000000FF) << 24) 15 ) 16 #define ntohl(i) ( 17 (((i)&0xFF000000) >> 24) + 18 (((i)&0x00FF0000) >> 8) + 19 (((i)&0x0000FF00) << 8) + 20 (((i)&0x000000FF) << 24) 21 ) 22 23 #endif /*BYTE_ORDER*/
float、double类型数据要将其指针转化成(int *)再用上述函数转换。
例2、
1 struct pgec {//32位,不存在字节对齐问题 2 #if (BYTE_ORDER == BIG_ENDIAN) 3 unsigned long cyclic_code :6; 4 unsigned long genapgate :7; 5 unsigned long no_framing :1; 6 unsigned long base :4; 7 unsigned long qrs_flag :1; 8 unsigned long dead_time :12; 9 unsigned long flag :1; 10 #else 11 unsigned long flag :1; 12 unsigned long dead_time :12; 13 unsigned long qrs_flag :1; 14 unsigned long base :4; 15 unsigned long no_framing :1; 16 unsigned long genapgate :7; 17 unsigned long cyclic_code :6; 18 #endif 19 long event_count;//注意访问问题 20 };
原文:http://www.cnblogs.com/LFMY/p/3624743.html