该文章讲的仅仅是通过java对于二进制文件解析操作

首先说明一下查看.dat文件的工具:C32Asm,可以通过该工具查看.dat文件,查看模式可以选择十六进制、十进制(我们最终要的是十进制)、八进制、二进制

注:开始解析文件之前,需先了解所要解析的文件的数据结构/每个数据项所占的字节长度

其实所谓的数据解析和读取普通的文件一样操作,只不过大多数人不了解二进制、十进制。。。。。

通过这种方式读取出来的内容为10进制,也就是我们日常生活中接触的数值,比如:100RMB,这个100就是十进制(打个比喻,让大家更好的理解一下,不喜勿喷)

重点是在于进制之间的转换,下面先来一段读取.dat文件的代码

1、读取二进制文件(.dat)

public class Main {
public static void main(String[] args) {
//文件所在路径
String filePath = "D:\\test";
//文件名称
String fileName = "123.dat";
// 源文件路径
File startFile = new File(filePath + fileName);
FileInputStream in = null;
try {
in = new FileInputStream(filePath + fileName);
int data = 0;
while ((data = in.read()) != -1) {
System.out.println("文件内容输出:"+data);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}

2、进制转换(将上面的代码先copy一份,进行微小的改动,会标红)

因为在实际情况中会是多个字节组装成一个数据项,本程序读取文件是一个字节一个字节读取的(大家可以根据自身情况修改),所以需要将每个字节进行存储,存储够一个数据项所需字节长度后,进行统一转换

public class Main {
public static void main(String[] args) {
//每次循环需要+1,用来计数
int num = 0;
//给数组赋予下标
int k= 0;
//这个数组就是存储字节数据,然后统一进行转换
int[] messDate = new int[20];
//文件所在路径
String filePath = "D:\\test";
//文件名称
String fileName = "123.dat";
// 源文件路径
File startFile = new File(filePath + fileName);
FileInputStream in = null;
try {
in = new FileInputStream(filePath + fileName);
int data = 0;
while ((data = in.read()) != -1) {
//如果能确定数据项所占字节长度是5
messDate[k] = data;
if(k==4){
String str = tenTransformSixteen(messDate,k);
System.out.println("文件内容输出:"+str);
k=0;
}
 
 
k+=1;
num+=1;
}
}catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}
/**

* 十进制转十六进制转十进制

* 需要将数组中每一个十进制字节转换成十六进制,然后拼接到一起,统一转换成十进制

* @param data字节数组

* @param k数组长度

* @return

*/

public String tenTransformSixteen(int[] data, int k) {
String str = "";
for (int i = 0; i < k; i++) {
// data为十进制,将每个十进制解析成十六进制,然后将数组中数值一起解析成十进制
String hexString = Integer.toHexString(data[i]);
if (hexString.length() == 1) {
hexString = "0" + hexString;
}
str = str + hexString;
}
str = String.valueOf(Long.valueOf(str, 16));
return str;
}