java实现解析二进制文件的方法(字符串、图片)
1、需求说明,实现细节要求:
解析二进制文件files\case10\binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据,数据长度均为数据字节长度,高位在后,字符串为UTF-8编码,请解析,输出字符串内容,图片文件保存为files\case10\test.png。
2、实现代码:
packagecom.igen.case10; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.net.URISyntaxException; /** * *@ClassNameCase10 *@DescriptionTODO * *@authorwjggwm *@data2017年2月7日上午11:46:25 */ publicclassCase10{ staticfinalStringfileName="/test.png"; staticfinalStringfilePath="D:/files/case10"; staticfinalStringsourceFileName="binary"; publicstaticvoidmain(String[]args){ try{ readFile(Case10.class.getResource(sourceFileName).toURI().getPath()); }catch(URISyntaxExceptione){ e.printStackTrace(); } } /** * *@Description解析二进制文件 *@paramsourceFileName * *@authorwjggwm *@data2017年2月7日上午11:47:12 */ publicstaticvoidreadFile(StringsourceFileName){ InputStreamin=null; try{ in=newFileInputStream(sourceFileName); //读取字符串数据长度字节 byte[]txtLenByte=newbyte[2]; in.read(txtLenByte); inttxtlen=byte2ToUnsignedShort(txtLenByte,0); //读取字符串字节 byte[]txtByte=newbyte[txtlen]; in.read(txtByte); //字符串为UTF-8编码 Stringtxt=newString(txtByte,"UTF-8"); //输出字符串 System.out.println(txt); //读取图片数据长度 byte[]imgLenByte=newbyte[4]; in.read(imgLenByte); intimgLen=byte4ToInt(imgLenByte,0); //读取图片数据 byte[]img=newbyte[imgLen]; in.read(img); //生成图片文件 saveToImgByBytes(filePath,fileName,img); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }finally{ if(in!=null){ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } } /** * *@Description将字节写入文件 *@paramimgName *@paramimgByte * *@authorwjggwm *@data2017年2月7日上午11:07:45 */ publicstaticvoidsaveToImgByBytes(StringfilePath,StringimgName,byte[]imgByte){ try{ Filedic=newFile(filePath); if(!dic.exists()){ dic.mkdirs(); } Fileimage=newFile(filePath+imgName); if(!image.exists()){ image.createNewFile(); } FileOutputStreamfos=newFileOutputStream(image); fos.write(imgByte); fos.flush(); fos.close(); }catch(Exceptione){ e.printStackTrace(); } } /** * *@Descriptionbyte数组转换为无符号short整数 *@parambytes *@paramoff *@return * *@authorwjggwm *@data2017年2月7日上午11:05:58 */ publicstaticintbyte2ToUnsignedShort(byte[]bytes,intoff){ //注意高位在后面,即大小端问题 intlow=bytes[off]; inthigh=bytes[off+1]; return(high<<8&0xFF00)|(low&0xFF); } /** * *@Descriptionbyte数组转换为int整数 *@parambytes *@paramoff *@return * *@authorwjggwm *@data2017年2月7日上午11:07:23 */ publicstaticintbyte4ToInt(byte[]bytes,intoff){ //注意高位在后面,即大小端问题 intb3=bytes[off]&0xFF; intb2=bytes[off+1]&0xFF; intb1=bytes[off+2]&0xFF; intb0=bytes[off+3]&0xFF; return(b0<<24)|(b1<<16)|(b2<<8)|b3; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。