您的位置:首页 > 其它

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

2008-11-25 12:45 295 查看
问题:最近在读取*.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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐