• 技术文章 >Java >java教程

    java实现解析二进制文件的方法

    高洛峰高洛峰2017-02-27 16:30:06原创974
    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;
    
    }
    
    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

    更多java实现解析二进制文件的方法相关文章请关注PHP中文网!


    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:java 二进制
    上一篇:Mybatis结果生成键值对 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Java数据结构之单链表与OJ题• 详细介绍Java正则表达式之单字符匹配和预定义字符• Java总结分享之反射、枚举、Lambda表达式• 实例详解Java顺序表和链表• 深入分析Java的序列化与反序列化
    1/1

    PHP中文网