在shapefile的shp文件格式中,数值的位序有Little和big的区别,对于位序是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();