[java学习]java实现解析二进制文件的方法(字符串、图片)

更新时间:2021-06-17    来源:js教程    手机版     字体:

【www.bbyears.com--js教程】

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;

/**

*

* @ClassName Case10

* @Description TODO

*

* @author wjggwm

* @data 2017年2月7日 上午11:46:25 

*/

publicclassCase10 {

staticfinalString fileName ="/test.png";

staticfinalString filePath ="D:/files/case10";

staticfinalString sourceFileName ="binary";

publicstaticvoidmain(String[] args) {

try{

readFile(Case10.class.getResource(sourceFileName).toURI().getPath());

}catch(URISyntaxException e) {

e.printStackTrace();

}

}

/**

*

* @Description 解析二进制文件

* @param sourceFileName

*

* @author wjggwm

* @data 2017年2月7日 上午11:47:12

*/

publicstaticvoidreadFile(String sourceFileName) {

InputStream in =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编码

String txt =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(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{

if(in !=null) {

try{

in.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

/**

*

* @Description 将字节写入文件

* @param imgName

* @param imgByte

*

* @author wjggwm

* @data 2017年2月7日 上午11:07:45

*/

publicstaticvoidsaveToImgByBytes(String filePath, String imgName,byte[] imgByte) {

try{

File dic =newFile(filePath);

if(!dic.exists()) {

dic.mkdirs();

}

File image =newFile(filePath + imgName);

if(!image.exists()) {

image.createNewFile();

}

FileOutputStream fos =newFileOutputStream(image);

fos.write(imgByte);

fos.flush();

fos.close();

}catch(Exception e) {

e.printStackTrace();

}

}

/**

*

* @Description byte数组转换为无符号short整数

* @param bytes

* @param off

* @return

*

* @author wjggwm

* @data 2017年2月7日 上午11:05:58

*/

publicstaticintbyte2ToUnsignedShort(byte[] bytes,intoff) {

// 注意高位在后面,即大小端问题

intlow = bytes[off];

inthigh = bytes[off +1];

return(high <<8&0xFF00) | (low &0xFF);

}

/**

*

* @Description byte数组转换为int整数

* @param bytes

* @param off

* @return

*

* @author wjggwm

* @data 2017年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;

}

}

本文来源:http://www.bbyears.com/wangyezhizuo/124281.html

热门标签

更多>>

本类排行