博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java实现解析二进制文件(字符串、图片)
阅读量:5917 次
发布时间:2019-06-19

本文共 2905 字,大约阅读时间需要 9 分钟。

1、需求说明,实现细节要求:

解析二进制文件 files\case10\binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据,数据长度均为数据字节长度,高位在后,字符串为UTF-8编码,请解析,输出字符串内容,图片文件保存为files\case10\test.png。

2、实现代码:

/*** */package com.igen.case10;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URISyntaxException;/*** * @ClassName Case10* @Description TODO** @author wjggwm* @data 2017年2月7日 上午11:46:25*/public class Case10 {static final String fileName = "/test.png";static final String filePath = "D:/files/case10";static final String sourceFileName = "binary";public static void main(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*/public static void readFile(String sourceFileName) {InputStream in = null;try {in = new FileInputStream(sourceFileName);// 读取字符串数据长度字节byte[] txtLenByte = new byte[2];in.read(txtLenByte);int txtlen = byte2ToUnsignedShort(txtLenByte, 0);// 读取字符串字节byte[] txtByte = new byte[txtlen];in.read(txtByte);//字符串为UTF-8编码String txt = new String(txtByte, "UTF-8");// 输出字符串System.out.println(txt);// 读取图片数据长度byte[] imgLenByte = new byte[4];in.read(imgLenByte);int imgLen = byte4ToInt(imgLenByte, 0);// 读取图片数据byte[] img = new byte[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*/public static void saveToImgByBytes(String filePath, String imgName, byte[] imgByte) {try {File dic = new File(filePath);if (!dic.exists()) {dic.mkdirs();}File image = new File(filePath + imgName);if (!image.exists()) {image.createNewFile();}FileOutputStream fos = new FileOutputStream(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*/public static int byte2ToUnsignedShort(byte[] bytes, int off) {// 注意高位在后面,即大小端问题int low = bytes[off];int high = 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*/public static int byte4ToInt(byte[] bytes, int off) {// 注意高位在后面,即大小端问题int b3 = bytes[off] & 0xFF;int b2 = bytes[off + 1] & 0xFF;int b1 = bytes[off + 2] & 0xFF;int b0 = bytes[off + 3] & 0xFF;return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;}}

  

转载于:https://www.cnblogs.com/gxbk629/p/6375122.html

你可能感兴趣的文章
alert
查看>>
验证码识别(最简单之印刷体数字)
查看>>
《Linux内核设计与实现》读书笔记(十九)- 可移植性
查看>>
thinkphp5.1路由设置小计
查看>>
POJ 1149 PIGS
查看>>
C#十五子游戏
查看>>
P1282 多米诺骨牌
查看>>
jQuery中attr,prop的区别
查看>>
js中的路由匹配
查看>>
移植性问题のerror C2664: “MessageBoxW”: 不能将参数 2 从“char [20]”转换为“LPCW......
查看>>
【转】学习总结之3D模型
查看>>
【Android】Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
查看>>
深入理解Magento – 第三章 – 布局,块和模板(转)
查看>>
POJ 2386 Lake Counting(bfs解法)
查看>>
python小技巧
查看>>
ul中li分列显示
查看>>
[SakuraiYo][软工作业(4)]用户体验分析:以 “师路南通网站” 为例
查看>>
LOJ#2095 选数
查看>>
java synchronized详解
查看>>
我的Java开发学习之旅------>自己编写的Java数组操作工具
查看>>