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;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。