java实现解析二进制文件的方法(字符串、图片)
作者:那君只为梦想而生 时间:2023-04-18 19:07:51
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;
}
}
来源:http://www.cnblogs.com/gxbk629/p/6375122.html
标签:java,二进制
0
投稿
猜你喜欢
Android 7.0以上版本实现应用内语言切换的方法
2022-12-21 00:25:31
如何解决修改StaticText的字体
2023-05-25 08:40:14
android九宫格可分页加载控件使用详解
2022-03-04 08:14:02
Logger.error打印错误异常的详细堆栈信息
2022-01-06 23:03:04
详解MyBatis的Dao层实现和配置文件深入
2022-07-26 02:29:17
SpringBoot读写操作yml配置文件方法
2023-10-11 00:13:03
c#实现sqlserver事务处理示例
2022-03-28 19:39:50
FloatingActionButton增强版一个按钮跳出多个按钮第三方开源之FloatingActionButton
2023-06-18 13:28:22
浅谈c++11线程的互斥量
2023-02-14 18:00:44
SpringBoot的异常处理流程是什么样的?
2021-07-09 17:54:40
详解spring中aop不生效的几种解决办法
2022-07-24 18:11:40
Mybatis判断空字符串的问题
2022-11-18 02:07:00
Android 中ScrollView与ListView冲突问题的解决办法
2022-06-15 04:31:46
Kotlin Suspend挂起函数的使用详解
2022-11-01 12:52:56
Java中null相关注解的实现
2022-09-24 06:31:59
SpringBoot整合Shiro的代码详解
2023-10-30 10:53:31
idea的easyCode的 MybatisPlus模板的配置详解
2022-04-18 21:01:29
Android简单实现启动画面的方法
2022-08-25 17:54:55
JAVA并发中VOLATILE关键字的神奇之处详解
2021-08-15 01:51:38
Java ArrayList扩容问题实例详解
2022-05-08 08:57:57