软件编程
位置:首页>> 软件编程>> java编程>> 利用Java读取二进制文件实例详解

利用Java读取二进制文件实例详解

作者:RustFisher  发布时间:2023-07-27 03:25:42 

标签:java,二进制文件

前言

本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

读Hex写CSV

data目录下有little-endian bin文件,2个字节代表一个数字。

bin存储的数据格式可自己定义。相同的方法可以直接应用到Android中。


`-- networkProj
|-- data
|-- networkProj.iml
|-- out
`-- src

实现方法


private static void convertFiles() {
File folder = new File("data"); // data folder
log("--------- Read little-endian data from bin file ---------");
if (!folder.exists()) {
 log("folder is not exist!");
 return;
}
File outputFolder = new File(folder.getAbsolutePath() + File.separator + "output");
if (!outputFolder.exists()) {
 boolean newOutput = outputFolder.mkdir();
 log("New output folder " + newOutput);
}
File[] files = folder.listFiles();
if (files != null) {
 log("folder is " + folder.getAbsolutePath());
 for (File f : files) {
  log("\t" + f.getName());
 }
} else {
 log("Nothing in this folder");
 return;
}
for (File currentFile : files) {
 if (!currentFile.isFile()) {
  return;
 }
 String fileName = currentFile.getName();
 fileName = fileName.substring(0, fileName.length() - 4); // delete suffix
 File csvFile = new File(outputFolder.getAbsolutePath() + File.separator + fileName + ".csv");
 if (csvFile.exists()) {
  boolean deRes = csvFile.delete();
  log("Delete old csv: " + deRes);
 }
 byte[] readBytes = new byte[512];
 try {
  boolean newCsv = csvFile.createNewFile();
  log(csvFile.getAbsolutePath() + " " + newCsv);
  FileOutputStream csvFos = new FileOutputStream(csvFile);
  InputStream in = new FileInputStream(currentFile);
  while (in.read(readBytes) != -1) {
   int[] csvData = convertBytesToInts(readBytes);
   for (int d : csvData) {
    csvFos.write(String.valueOf(d).getBytes());
    csvFos.write("\n".getBytes());
   }
  }
  csvFos.flush();
  csvFos.close();
 } catch (Exception e) {
  e.printStackTrace();
 }
}
}
// little-endian; 2 bytes -> 1 int
private static int[] convertBytesToInts(byte[] inputData) {
int[] rawData = new int[inputData.length / 2];
int rawIndex = 0;
for (int i = 0; i < inputData.length; i += 2) {
 int raw = (0xff & inputData[i + 1]) * 256 + (0xff & inputData[i]);
 if (raw >= 32768) {
  raw -= 65536;
 }
 rawData[rawIndex] = raw;
 rawIndex++;
}
return rawData;
}
private static void log(String l) {
System.out.println(l);
}

控制台输出


--------- Read little-endian data from bin file ---------
New output folder true
folder is G:\javaProj\networkProj\data
data20170215_180621.bin
output
G:\javaProj\networkProj\data\output\data20170215_180621.csv true

来源:http://rustfisher.github.io/2017/02/16/Java_note/Java_Read_Hex_write_csv/

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com