Big Endian 与 Little Endian以及如何读little Endian

问题:最近在读取*.wav文件,其中涉及到16位的字的读取,就是说字先读低位字节,后读高位字节,如ed 3c读出后的字为3c ed,这个和读取*3.ds文件格式的字是一样的,想了想,这个有什么关系呢?后来才知道字原来有“Big Endian 与 Little Endian”之分,顺便就查了查相关的知识,同时搜集了下,读取字的方法。就总结了一下。

解答:

一: Big Endian 与 Little Endian
1。概念
Big Endian : The most significant byte is on the left end of the word
Little Endian : The most significant byte is on the right end of the word
例如:word 0x1234 在内存中是
Big Endian : 低字节(left end of the word )0x12
                      高字节(right end of the word )0x34
End Endian : 低字节(left end of the word )0x34
                      高字节(right end of the word )0x12

2。其需要注意得地方
由于不同cpu对字节序的处理可能是不同,比如x86系列是使用little-endian字节序,SGI机器则是使用big-endian字节序。所以在对跨平台通讯的时候特别要注意字节序的转换。由于历史问题,网络字节序统一为big-endian。只要通讯双方机器在网络传输中统一把字节转换为big-endian,则不会出现问题。由此你可以了解到socket编程中系统为用户提供的字节序转换函数ntohl, htonl, ntohs, htons的含义所在了。

3。总结
假设我们要在不同byte ordering的机器之间传输和交换数据,那该怎么办呢,有两个方法,一是全部转换成文本来传输(如XML使用的),另一个方法两方都按照某一方的byte order,这时就涉及到了不同byte order之间相互转换的问题(网络传输标准如TCP/IP采用第二种方法并且由于历史的原因,byte ordering是big-endian的)。

 

二:如何读取little-endian方式的字和双字

就是fread()以及CArive类都有自动把高字节的作为高位的功能,由于我的表述能力不好:这里我设计了一个例子:写入4个char到文件里,然后fread读取就会自动按照高字节的作为高位的形式读出来,
#include<stdio.h>
void main()
{
  unsigned char a,b,c,d;
  a=0xed;
  b=0x3c;
 c=0x25;
    d=0x43;
    FILE *fp;
 //顺序写入
 fp=fopen("1.txt","w+");
    fwrite(&a,1,1,fp);
 fwrite(&b,1,1,fp);
 fwrite(&c,1,1,fp);
 fwrite(&d,1,1,fp);
 fclose(fp);
 //读出来
 fp=fopen("1.txt","rb");
    //字类型   
 unsigned short j=0;
 fread(&j,sizeof(short),1,fp);
    fseek(fp,0,SEEK_SET);
 //双字类型
 unsigned int k=0;
 fread(&k,sizeof(int),1,fp);
 fclose(fp);
 printf("%x/n",j);
 printf("%x/n",k);
}
相应的CArchive的>>读入类似,这里就不举例了。
其实 fread(&j,sizeof(shrot),1,fp)的功能可以等价为:
这两个函数:
unsigned char ReadByte(){
 unsigned char out;
 fread(&out,1,1,pfile);
 return out;

unsigned short ReadWord(){
 return ReadByte()+(ReadByte()<<8);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值