Java二进制文件解析之最终解析
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);
这样我们就可以将这个二进制文件转为一个或多个对象,方便我们对获得的这些数据进行处理了。