• java实现解析二进制文件(字符串、图片)


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

    解析二进制文件 filescase10inary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据,数据长度均为数据字节长度,高位在后,字符串为UTF-8编码,请解析,输出字符串内容,图片文件保存为filescase10 est.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;
    }
    
    }
    

      

  • 相关阅读:
    插件模块与模块之间的通信(转)
    C#反射调用其它DLL的委托事件 传值
    单元测试
    c#实现动态加载Dll(转)
    Access sql语句创建表及字段类型(转)
    关于不同数据库表自动转换的功能
    通过DataTable获得表的主键
    C/s程序过时了吗?
    关于C/s结构 本地目录的思考
    关于创建人,创建日期,修改人,修改日期
  • 原文地址:https://www.cnblogs.com/gxbk629/p/6375122.html
Copyright © 2020-2023  润新知