Advertisement

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;

}

全部评论 (0)

还没有任何评论哟~