Java二进制文件解析,就是对一个二进制文件进行读取,将里面的二进制数据按照存储协议转换为我们需要的数据结构,供我们进行存储或其他使用。本篇主要继承Java二进制解析的前两篇文章之后,对二进制文件进行读取,并转换为我们需要的数据对象。
工具/原料
MyEclipse
二进制文件
方法/步骤
1、读取二进制文件,并将二进制文件转为byte[],方便后续擢爻充种的二进制数组截取,详细内容如下,如图所示:@Sup禊诬娱飑pressWarnings("resource") publicbyte[]getContent(StringfilePath)throwsIOException{ Filefile=newFile(filePath); longfileSize=file.length(); if(fileSize>Integer.MAX_VALUE){ System.out.println("filetoobig..."); returnnull; } FileInputStreamfi=newFileInputStream(file); byte[]buffer=newbyte[(int)fileSize]; intoffset=0; intnumRead=0; while(offset<buffer.length &&(numRead=fi.read(buffer,offset,buffer.length-offset))>=0){ offset+=numRead; } //确保所有数据均被读取 if(offset!=buffer.length){ thrownewIOException("Couldnotcompletelyreadfile"+file.getName()); } fi.close(); returnbuffer; }
2、准备截取二进制数组的方法,截取方法如下:/** *截取字节数组 *@parambytes原始数组 *@paramoffset偏移量 *@paramsize长度 *@return新的字节数组 */ publicstaticbyte[]copyBytes(byte[]bytes,intoffset,intsize){ byte[]newBytes=newbyte[size]; System.arraycopy(bytes,offset,newBytes,0,size); returnnewBytes; }
3、准备将字节数组转为无符号short类型的方法(注:其他转int,转string类型的方法就不在这儿一一写出来了),方法如下:/***将字节数组转为short类型(注:由于转换后为有符号short,但我们需要无符号short,所以与上0x0FFFF,返回int类型)*@paramb*@return*/publicstaticintbyte2Short(byte[]b){shortshortValue=0;for(inti=0;i<b.length;i++){ shortValue+=(b[i]&0x00FF)<<(8*(1-i));}returnshortValue&0x0FFFF;}
4、在将上述的基本方法准备结束之后就可以正式解析了,解析的主要原理就是“按照数据协议,宀窜褓沙截取每一个属性对应的字节数组,然后将该字节数组转换为我们需要的数值”撅掏浑锌。解析方法如下:publicstaticMessageHeadergetMessageHeader(byte[]bytes){ MessageHeaderresult=newMessageHeader(); intoffset=0; intsize=0; byte[]b; /** *开始解析 */ size=2; b=DataUtil.copyBytes(bytes,offset,size); inttag=DataUtil.byte2Short(b); result.setTag(tag); offset+=size; b=DataUtil.copyBytes(bytes,offset,size); intlength=DataUtil.byte2Short(b); result.setLength(length); offset+=size;returnresult;}
5、在引用第四步的方法时,需传入第一步中读取的结果byte[],如下所示:MessageHeaderheader=getMessageHeader(bytes);这样我们就可以将这个二进制文件转为一个或多个对象,方便我们对获得的这些数据进行处理了。