java解析二进制文件(.dat)
该文章讲的仅仅是通过java对于二进制文件解析操作
请了解使用C32Asm这一工具来查看.dat文件,并通过该工具可以访问这些文件的不同数据模式;这些模式包括十六进制、十进制定点格式(本例中我们选择十进定点格式)、八进制和二元数据格式。
注: 在处理相关数据时必须明确被解析文件的数据架构/每个数据项占用的空间大小
实际上指的就是普通文件的操作流程:打开、读取内容以及保存这些基本步骤与二进制数据解析有所不同。
采用这种读取方式获取的信息属于十进制体系;即我们日常生活中常见的数值类型;例如,在实际应用中我们可以看到这样的情况:10^{2}RMB;其中数字'1'代表百位数,' ̄
̄
'代表十位数,' ̄
'代表个位数;其中数字'1'代表百位数,' ̄
'代表十位数,'̄
'代表个位数;其中数字'1'代表百位数, '̄
'代表十位数, '̄
'代表个位数;其中数字'1'代表百位数, '̄
'代表十位数, '̄
'代表个位数;为了帮助大家更好地理解这一概念(不喜勿喷)
重点是在于进制之间的转换,下面先来一段读取.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;
}
