问题描述
我用BinaryReader读取shapefile文件的.dbf文件,.dbf文件由头文件和实体内容组成,读取头文件的内容都对,但是在读取实体内容时(它是由一条条记录项组成),读出来的都不是想要的内容。这是头文件的描述位置内容说明0-1011个字节记录项名称,是ASCII码值。111个字节记录项的数据类型,是ASCII码值。(B、C、D、G、L、M和N,具体的解释见表2.9)。12-154个字节保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。161个字节记录项长度,二进制型。171个字节记录项的精度,二进制型。18-192个字节保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。201个字节工作区ID。21-3010个字节保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。311个字节MDX标识。如果存在一个MDX格式的索引文件,那么这个记录项为真,否则为空。这是表2.9代码数据类型允许输入的数据B二进制型各种字符。C字符型各种字符。D日期型用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。G(GeneralorOLE)各种字符。N数值型(Numeric)-.0123456789L逻辑型(Logical)?YyNnTtFf(?表示没有初始化)。M(Memo)各种字符。这是我读取的代码://读取dbf文件//读取头文件publicvoidReadHerder(){version=binaryfiledbf.ReadByte();for(inti=0;i<3;i++){date[i]=binaryfiledbf.ReadByte();}RecordNum=binaryfiledbf.ReadInt32();HerderByteNum=binaryfiledbf.ReadInt16();fieldscount=(HerderByteNum-33)/32;//记录项个数,不属于记录项信息描述数组RcordByteNum=binaryfiledbf.ReadInt16();for(inti=0;i<2;i++){Reserved1[i]=binaryfiledbf.ReadByte();}Flag4s=binaryfiledbf.ReadByte();EncrypteFlag=binaryfiledbf.ReadByte();for(inti=0;i<12;i++){Unused[i]=binaryfiledbf.ReadByte();}MDXFlag=binaryfiledbf.ReadByte();LDriID=binaryfiledbf.ReadByte();for(inti=0;i<2;i++){Reserved2[i]=binaryfiledbf.ReadByte();}//未读完头文件,还有记录项信息描述数组和Terminate//读取记录项信息数组描述for(intj=0;j<fieldscount;j++)//读取一条记录中的每一个记录项的信息{for(inti=0;i<11;i++){name[i]=binaryfiledbf.ReadByte();}fieldType=binaryfiledbf.ReadByte();for(inti=0;i<4;i++){Reserved3[i]=binaryfiledbf.ReadByte();}fieldLength=newbyte[fieldscount];fieldLength[j]=binaryfiledbf.ReadByte();decimalCount=binaryfiledbf.ReadByte();for(inti=0;i<2;i++){Reserved4[i]=binaryfiledbf.ReadByte();}workID=binaryfiledbf.ReadByte();for(inti=0;i<10;i++){Reserved5[i]=binaryfiledbf.ReadByte();}mDXFlag1=binaryfiledbf.ReadByte();}Terminate=binaryfiledbf.ReadByte();}//读取实体信息publicvoidReadContent(){NameStr=newstring[RecordNum];//FileStreama=newFileStream("\StorageCard\a.txt",FileMode.Open);//string[]myStr=newstring[RcordNum];dbfName=newstring[RecordNum,fieldscount];//用来存取每一条记录中的每一个记录项的值for(inti=0;i<RecordNum;i++)//每一条记录开始读取{DeleteFlag=binaryfiledbf.ReadByte();//这是每一条记录中开头的一小空格for(intj=0;j<fieldscount;j++)//每一条记录项开始读取{intchangefieldscount=Convert.ToInt32(fieldLength[j]);//将字节转换为整型byte[]temp=binaryfiledbf.ReadBytes(changefieldscount);dbfName[i,j]=BitConverter.ToString(temp);//Encodinga=Encoding.ASCII;//Encodingb=Encoding.Unicode;//Encoding.Convert(a,b,temp);//dbfName[i,j]=BitConverter.ToString(temp);}}for(inti=0;i<RecordNum;i++){NameStr[i]=dbfName[i,0];}binaryfiledbf.Close();filedbf.Close();}代码贴完,问题就出在dbfName[i,j]这个得出来的是另一种编码的东西,不是我想要的字符串的真正内容。各位高手能帮我看看怎么解决么?
解决方案
解决方案二:
网上有Base64编码和解码的源码,可搜下
解决方案三:
MD5/Base64/DES是常用来对用户身份验证的算法,本人陆续公开了自己常用的这三种算法的源代码,不足之处,希望大家批评指正。