LFMY

导航

字节序

一、字节序内存分布图

小端主机上

小端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 };
自定义结构体

posted on 2014-03-26 10:30  LFMY  阅读(218)  评论(0)    收藏  举报