java實(shí)現(xiàn)解析二進(jìn)制文件的方法(字符串、圖片)
1、需求說明,實(shí)現(xiàn)細(xì)節(jié)要求:
解析二進(jìn)制文件 files\case10\binary,其中包含一個(gè)字符串和一張圖片,數(shù)據(jù)文件格式為字符串?dāng)?shù)據(jù)長度(2字節(jié))+字符串內(nèi)容+圖片數(shù)據(jù)長度(4字節(jié))+圖片數(shù)據(jù),數(shù)據(jù)長度均為數(shù)據(jù)字節(jié)長度,高位在后,字符串為UTF-8編碼,請解析,輸出字符串內(nèi)容,圖片文件保存為files\case10\test.png。
2、實(shí)現(xiàn)代碼:
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 解析二進(jìn)制文件
* @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);
// 讀取字符串?dāng)?shù)據(jù)長度字節(jié)
byte[] txtLenByte = new byte[2];
in.read(txtLenByte);
int txtlen = byte2ToUnsignedShort(txtLenByte, 0);
// 讀取字符串字節(jié)
byte[] txtByte = new byte[txtlen];
in.read(txtByte);
//字符串為UTF-8編碼
String txt = new String(txtByte, "UTF-8");
// 輸出字符串
System.out.println(txt);
// 讀取圖片數(shù)據(jù)長度
byte[] imgLenByte = new byte[4];
in.read(imgLenByte);
int imgLen = byte4ToInt(imgLenByte, 0);
// 讀取圖片數(shù)據(jù)
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 將字節(jié)寫入文件
* @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數(shù)組轉(zhuǎn)換為無符號short整數(shù)
* @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數(shù)組轉(zhuǎn)換為int整數(shù)
* @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;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb Spring依賴注入深入學(xué)習(xí)
這篇文章主要為大家詳細(xì)介紹了JavaWeb Spring依賴注入,深入學(xué)習(xí)Spring依賴注入,感興趣的小伙伴們可以參考一下2016-09-09
springboot集成nacos實(shí)現(xiàn)自動(dòng)刷新的示例代碼
研究nacos時(shí)發(fā)現(xiàn),springboot版本可使用@NacosValue實(shí)現(xiàn)配置的自動(dòng)刷新,本文主要介紹了springboot集成nacos實(shí)現(xiàn)自動(dòng)刷新的示例代碼,感興趣的可以了解一下2023-11-11

