多语言展示
当前在线:156今日阅读:84今日分享:32

Java二进制文件解析之最终解析

Java二进制文件解析,就是对一个二进制文件进行读取,将里面的二进制数据按照存储协议转换为我们需要的数据结构,供我们进行存储或其他使用。本篇主要继承Java二进制解析的前两篇文章之后,对二进制文件进行读取,并转换为我们需要的数据对象。
工具/原料
1

MyEclipse

2

二进制文件

方法/步骤
1

读取二进制文件,并将二进制文件转为byte[],方便后续的二进制数组截取,详细内容如下,如图所示:@SuppressWarnings('resource') public byte[] getContent(String filePath) throws IOException {   File file = new File(filePath);   long fileSize = file.length(); if (fileSize > Integer.MAX_VALUE) {   System.out.println('file too big...');   return null;   }   FileInputStream fi = new FileInputStream(file);   byte[] buffer = new byte[(int) fileSize];   int offset = 0;   int numRead = 0;   while (offset < buffer.length   && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {   offset += numRead;   }   // 确保所有数据均被读取   if (offset != buffer.length) {   throw new IOException('Could not completely read file '    + file.getName());   }   fi.close();   return buffer;   }

2

准备截取二进制数组的方法,截取方法如下:/** * 截取字节数组 * @param bytes 原始数组 * @param offset 偏移量 * @param size 长度 * @return 新的字节数组 */ public static byte[] copyBytes(byte[] bytes, int offset, int size){ byte[] newBytes = new byte[size]; System.arraycopy(bytes, offset, newBytes, 0, size); return newBytes; }

3

准备将字节数组转为无符号short类型的方法(注:其他转int,转string类型的方法就不在这儿一一写出来了),方法如下: /**     * 将字节数组转为short类型(注:由于转换后为有符号short,但我们需要无符号short,所以与上0x0FFFF,返回int类型)     * @param b     * @return     */    public static int byte2Short(byte[] b) {        short shortValue = 0;        for (int i = 0; i < b.length; i++) {        shortValue += (b[i] & 0x00FF) << (8 * (1 - i));        }        return shortValue & 0x0FFFF;    }

4

在将上述的基本方法准备结束之后就可以正式解析了,解析的主要原理就是“按照数据协议,截取每一个属性对应的字节数组,然后将该字节数组转换为我们需要的数值”。解析方法如下:public static MessageHeader getMessageHeader(byte[] bytes){ MessageHeader result = new MessageHeader(); int offset = 0; int size = 0; byte[] b; /** * 开始解析 */ size = 2; b = DataUtil.copyBytes(bytes, offset, size); int tag = DataUtil.byte2Short(b); result.setTag(tag); offset += size; b = DataUtil.copyBytes(bytes, offset, size); int length = DataUtil.byte2Short(b); result.setLength(length); offset += size;return result;}

5

在引用第四步的方法时,需传入第一步中读取的结果byte[],如下所示:MessageHeader header = getMessageHeader(bytes);这样我们就可以将这个二进制文件转为一个或多个对象,方便我们对获得的这些数据进行处理了。

注意事项

这只是最简单的数据结构,但即使是复杂的数据结构,道理也是相通的

推荐信息