页面载入中....  
页面载入中....
时 间 记 忆
页面载入中....
最 新 评 论
页面载入中....
专 题 分 类
页面载入中....
最 新 日 志
页面载入中....
最 新 留 言
页面载入中....
搜 索
用 户 登 录
页面载入中....
友 情 连 接
博 客 信 息
页面载入中....


 
shapefile文件的位序转换问题
[ 2008-3-31 16:13:00 | By: Nicole ]
 

     在shapefile的shp文件格式中,数值的位序有Littlebig的区别,对于位序是big的数据我们在读取时要小心。

       通常,数据的位序都是Little,但在有些情况下可能会是big,二者的区别在于它们位序的顺序相反。一个位序为big的数据,如果我们想得到它的真实数值,需要将它的位序转换成Little即可。下面分别用vc与c#写的程序

VC:来自网络

unsigned long CShpReadDlg::OnChangeByteOrder(int indata)
{
        char ss[8];
        char ee[8];
        unsigned long val = unsigned long(indata);
        _ultoa( val, ss, 16 );//将十六进制的数(val)转到一个字符串(ss)中
        int i;
        int length=strlen(ss);
        if(length!=8)
        {
                for(i=0;i<8-length;i++)
                        ee[i]='0';
                for(i=0;i<length;i++)
                        ee[i+8-length]=ss[i];
                for(i=0;i<8;i++)
                        ss[i]=ee[i];
        }
        ////******进行倒序
        int t;
        t      =ss[0];
        ss[0]       =ss[6];
        ss[6]       =t;
        t      =ss[1];
        ss[1]       =ss[7];
        ss[7]       =t;
        t      =ss[2];
        ss[2]       =ss[4];
        ss[4]       =t;
        t      =ss[3];
        ss[3]       =ss[5];
        ss[5]       =t;
    ////******
        //******将存有十六进制数(val)的字符串(ss)中的十六进制数转成十进制数
        int value=0;
        for(i=0;i<8;i++)
        {
                int k;
                CString mass;
                mass=ss[i];
                if(ss[i]=='a' ||
                        ss[i]=='b' ||
                        ss[i]=='c' ||
                        ss[i]=='d' ||
                        ss[i]=='e' ||
                        ss[i]=='f')
                        k=10+ss[i]-'a';
                else
                        sscanf(mass,"%d",&k);
                value=value+int(k*pow(16,7-i));
        }
       return (value);

}

 

c# 我自己的:

(1)位序转换

           int a = 9994;
            byte[] lbt = BitConverter.GetBytes(a);  //将int转变为byte
            byte[] bbt  = new byte[4];             //用于存放big byte,维数为4
            bbt[0] = lbt[3];                       //0
            bbt[1] = lbt[2];                       //0
            bbt[2] = lbt[1];                       //39
            bbt[3] = lbt[0];                       //10

(2)输出到文件

           FileStream fst = new FileStream("F:\\shp.shp", FileMode.OpenOrCreate, FileAccess.Write);
            BinaryWriter w = new BinaryWriter(fst);        
            w.Flush();
            for (int i = 0; i < b;i++ )
            {
              w.Write(bbt[i]);
           }
           w.Flush();          
           w.Close();

 

 
  • 标签:shapefile 文件格式 
  • 发表评论:
    页面载入中....
    Powered by Oblog.