이 글에서는 주로 Java에서 바이너리 파일(문자열, 그림)을 파싱하는 방법을 소개합니다. 편집자는 꽤 좋다고 생각해서 지금 공유하고 참고용으로 올려드리겠습니다. 편집기를 따라 살펴보겠습니다
1. 요구 사항 설명, 구현 세부 정보:
문자열과 이미지가 포함된 바이너리 파일 filescase10binary를 구문 분석합니다. 데이터 파일 형식은 문자열 데이터 길이입니다. (2바이트) + 문자열 내용 + 이미지 데이터 길이(4바이트) + 이미지 데이터입니다. 데이터 길이는 데이터 바이트 길이이며, 문자열은 UTF-8로 인코딩되어 출력됩니다. 문자열 내용, 그림 파일은 filescase10test.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; } }
위는 Java에서 바이너리 파일을 파싱하는 방법(문자열, 그림)에 대한 자세한 설명입니다. , 기타 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!