字节序的问题

来源:互联网 发布:网络招商好做吗 编辑:程序博客网 时间:2024/05/16 05:32

最近读shape文件,文档指出了大字节序(big endian)和小字节序(little endian) 。搜索引擎告诉我,这个东西原意是鸡蛋的大小两头,在计算机里是内存中是高低字节的排列方式而已;同时,又引出了有的机器是9位、12位等等为一字节的,这个我不想说了,对我完全没有意义。

其实,只要明白两个问题就行了:

1、vc++中,是小字节序的,一个字节8位,char 为一个字节,int为4个字节

2、大小转换的方法:

我有两个办法,一个是位移,一个使用memcpy其实很简单。

CFile file;
 CFileException e;

 if(file.Open("d://sss.shp",CFile::typeBinary | CFile::modeRead  ,&e))
 {

  char charBuffer[4];
   int a;
   file.Read(charBuffer,4);
 //  char charBuffer1[4];
   file.Seek(0,0);
  //高低位交换的两种方法
  // 方法1:位移
   file.Read(&a,4);
   int b1=0,b2=0,b3=0,b4=0;四个数每位都为0

int一共32位,先得到最后八位(b1),然后得到倒数第二个八位(b2)·······
把四个数相与即可

 b1=a>>24;
   b2=a>>16;
   b2=b2<<24;
   b2=b2>>16;
   b3=a>>8;
   b3=b3<<24;
   b3=b3>>8;
   b4=a<<24;
   a=b1|b2|b3|b4;
   
//方法2:用char类型交换
   /*
   int b=0;
      int c=0;
      
      c=a>>24&(~(~b<<24));
   
      memcpy(charBuffer,&a,4);
      for(int i=0;i<2;i++)
      {
       char j;
       j=charBuffer[i];
       charBuffer[i]=charBuffer[3-i];
       charBuffer[3-i]=j;
      }
      memcpy(&a,charBuffer,4);*/
   
  TRACE("%d",a);
 }

例子中打开的是一个shape文件,可以到网上找或者用esri 的 arcmap导出来一个。

位移的方法其实很简单,也就是大学时学谭浩强的c语言书上的位移举例一章的内容了。第二种方法其实更简单,

把一个整数截成4段(4个字节吗)放到四个cha中,然后倒个顺序,再拷回去,完事。劈开和合并时c++只能用memcpy函数了。

上面两种方法,据说位移更快些,快多少呢?我不知道了

至于牛人们还有用汇编的可能更简单些,不过我不会!

顺便提一句,谭浩强的c语言书是考二级用的!二级是某些城市进城要户口的最低标准,汗!

原创粉丝点击