【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;
}
}