首页 > 其他 > 详细

字节序

时间:2014-03-26 21:36:15      阅读:526      评论:0      收藏:0      [点我收藏+]

一、字节序内存分布图

小端LE:低位(数据)单元存放在低位(存储)单元,如Windows、Linux、x86的CPU;

大端BE:低位(数据)单元存放在高位(存储)单元,如IOS、PowerPC处理器;

bubuko.com,布布扣
bubuko.com,布布扣
 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 }
字节序问题(小端主机输出)
bubuko.com,布布扣

注意问题:

1、主机字节序问题只发生在int、short、char等基本数据间基本数据内部不存在这种问题。

2、网络字节序问题不同于主机字节序,任何数据都以Byte传递,一定要考虑字节序问题。

二、主机字节序检测方法

网络字节序为big endian。

bubuko.com,布布扣
bubuko.com,布布扣
 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 }
检测主机字节序
bubuko.com,布布扣

三、关于字节序的平台移植方法

例1、

bubuko.com,布布扣
bubuko.com,布布扣
 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*/
自定义转换函数
bubuko.com,布布扣

float、double类型数据要将其指针转化成(int *)再用上述函数转换。

例2、

bubuko.com,布布扣
bubuko.com,布布扣
 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 };
自定义结构体
bubuko.com,布布扣

字节序,布布扣,bubuko.com

字节序

原文:http://www.cnblogs.com/LFMY/p/3624743.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!