注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

阿英讲BIG-ENDIAN(大端)和Little-ENDIAN(小端)  

2012-07-25 00:53:07|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
即以此功德,庄严佛净土。上报四重恩,下济三途苦。惟愿见闻者,悉发菩提心。在世富贵全,往生极乐国。
首先明确Little-ENDIAN(小端)是指低内存地址的存放的是数据的低字节。
 
比如 int a = 0x05060708
  在BIG-ENDIAN的情况下存放为:
  内存地址 0x3   0x2    0x1     0x0
  数据        08     07      06       05  % 数据的高位字节05存放咋内存的低地址0x0中,JAVA  
       在LITTLE-ENDIAN的情况下存放为:
  内存地址 0x3    0x2    0x1     0x0
  数据        05      06      07      08  %   数据的高位字节05存放咋内存的高地址0x3中,  C, MATLAB, Windows 7
注意: 实际中,一般软件中显示内存时为 0x0  0x1 0x2 .... 此时0x05060708 的LITTLE-ENDIAN 在内存中的存放顺序的显示顺序为08     07      06       05 。感谢好友爱驰2012-10-12晚的讲解,他让我彻底分清了大端,小端的!
 
 
 
MATLAB中对于采用BIG-ENDIAN存储的 data = '08070605';要data2 = data([7:8, 5:6, 3:4, 1:2]) 转换为LITTLE-ENDIAN
然后hex2dec(data2)才对!

1. little endian 和 big endian的判断, 怎样判断机器的字节顺序是高字节在前还是低字节在前?
#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello, world\n");
int x = 1;
    if(*(char *)&x == 1)
        printf("little-endian\n"); % Win7 系统是低字节在前
    else
        printf("big-endian\n");

return 0;
}

2. little endian 和 big endian的转换

#include <stdio.h>
typedef union
{
 long l;
 char ch[sizeof(long)];
}endian;

endian little_2_big(endian in)
{
 endian out;
 int i=0;
 for(i=0;i<sizeof(long);i++)
 {
  out.ch[sizeof(long)-i-1] = in.ch[i];
 }
 return out;
}

endian big_2_little(endian in)
{
 endian out;
 int i=0;
 for(i=0;i<sizeof(long);i++)
 {
  out.ch[i] = in.ch[sizeof(long)-1-i];
 }
 return out;
}
int main(int arg, char** argv)
{
 endian data_in,data_out;
 int i=0;
 data_in.l = 0x12345678;
 printf("The system is x86 series, so it is little endian!\n");
 for(i=0; i<sizeof(long);i++)
 {
  printf("data_in.ch[%d] = 0x%x ",i,data_in.ch[i]);
 }
 printf("\n");
 printf("Convert the little endian to big endian!\n");
 data_out = little_2_big(data_in);
 printf("data_out.l =0x%x\n",data_out.l);
 for(i=0; i<sizeof(long);i++)
 {
  printf("data_out.ch[%d] = 0x%x ",i,data_out.ch[i]);
 }
 printf("\n");
 printf("Convert the big endian to little endian!\n");
 data_out = big_2_little(data_out);
 printf("data_out.l =0x%x\n",data_out.l);
 for(i=0; i<sizeof(long);i++)
 {
  printf("data_out.ch[%d] = 0x%x ",i,data_out.ch[i]);
 }
 printf("\n");
 return 0;
}


3. 结论

若32位AD采样给出的值为0x12345678,对于0x12345678 中字节'12'位于高内存地址0x2003,字节'78'位于低内存地址0x2000的小端存储格式。LITTLE-ENDIAN 在内存0x2000~0x2003中的存放顺序的显示顺序为 78     56      34       12

数据处理时hex2dec('12345678')就是0x12345678对应的10进制数(高<---低)

  评论这张
 
阅读(916)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016