最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
java实现解析二进制文件的方法(字符串、图片)
时间:2017-03-27 编辑:简简单单 来源:一聚教程网
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; } } |
-
上一个: 深入理解Java Socket通信
-
下一个: Java中正则表达式去除html标签
相关文章
- SpringBoot测试配置属性与web启动环境解析 10-24
- vue中将el-switch值true、false改为number类型的1和0解析 10-24
- Vue中的路由配置项meta使用解读 10-24
- SpringBoot自定义bean绑定解析 10-24
- SpringBoot常用计量与bean属性校验和进制数据转换规则解析 10-24
- 工厂方法在Spring框架中的运用介绍 10-24