java實(shí)現(xiàn)解析二進(jìn)制文件的方法(字符串、圖片)
1、需求說(shuō)明,實(shí)現(xiàn)細(xì)節(jié)要求:
解析二進(jìn)制文件 files\case10\binary,其中包含一個(gè)字符串和一張圖片,數(shù)據(jù)文件格式為字符串?dāng)?shù)據(jù)長(zhǎng)度(2字節(jié))+字符串內(nèi)容+圖片數(shù)據(jù)長(zhǎng)度(4字節(jié))+圖片數(shù)據(jù),數(shù)據(jù)長(zhǎng)度均為數(shù)據(jù)字節(jié)長(zhǎng)度,高位在后,字符串為UTF-8編碼,請(qǐng)解析,輸出字符串內(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ù)長(zhǎng)度字節(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ù)長(zhǎng)度 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é)寫(xiě)入文件 * @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)換為無(wú)符號(hào)short整數(shù) * @param bytes * @param off * @return * * @author wjggwm * @data 2017年2月7日 上午11:05:58 */ public static int byte2ToUnsignedShort(byte[] bytes, int off) { // 注意高位在后面,即大小端問(wèn)題 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) { // 注意高位在后面,即大小端問(wèn)題 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; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot集成Mybatis中如何顯示日志的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot集成Mybatis中如何顯示日志的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java中的ReadWriteLock高效處理并發(fā)讀寫(xiě)操作實(shí)例探究
這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫(xiě)操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01關(guān)于Spring Boot獲取bean的3種方式
這篇文章主要介紹了關(guān)于Spring Boot獲取bean的3種方式,在spring中ApplicationContext這個(gè)上下文對(duì)象是獲取bean的基礎(chǔ),需要的朋友可以參考下2023-04-04