我有一个包含大量字节的hex文件,我需要根据特定字节拆分这些字节,例如
f0 1 5 0 0 0 0 0 0 b7 7a 7a e5 db 40 2 0 c0 0 0 9 18 16 0 e3 1 40 0 0 3f 20 f0 1 5 0 0 0 0 0 0 41 bc 7a e5 db 40 2 0 c0 1 0 9 18 16 0 e3 1 40 0 0 3f 20 f0 1 5 0 0 0 0 0 0 53 3f 7b e5 db 40 2 0 c0 3 0 9 2 19 24 3d 0 22 68 1 db 9
当我看到“f0”时,我想分割字节并存储它们,就像这些
f0 1 5 0 0 0 0 0 0 b7 7a 7a e5 db 40 2 0 c0 0 0 9 18 16 0 e3 1 40 0 0 3f 20
f0 1 5 0 0 0 0 0 0 41 bc 7a e5 db 40 2 0 c0 1 0 9 18 16 0 e3 1 40 0 0 3f 20
f0 1 5 0 0 0 0 0 0 53 3f 7b e5 db 40 2 0 c0 3 0 9 2 19 24 3d 0 22 68 1 db 9
并且对于这些中的每一个我都将它视为一个字符数组来进行一些字符串操作。
我如何存储这些模式,以及如何将其视为执行操作的字符。
这就是我试图做的事情
String filename = "C:\\tm09888.123";
FileInputStream in = null;
int readHexFile = 0;
char hexToChar = ' ';
String[] bytes = new String[10];
try
{
in = new FileInputStream(filename);
while((readHexFile = in.read()) != -1)
{
if (Integer.toHexString(readHexFile).equals("f0"))
{
System.out.print("\n\n\n");
}
System.out.print(Integer.toHexString(readHexFile) + " ");
}
}
catch (IOException ex)
{
Logger.getLogger(NARSSTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
我成功地分割了模式,但是如何存储它并在每个模式上执行字符串操作
答案 0 :(得分:2)
如果文件是二进制文件,你想打印成一系列十六进制数字,你可以
BufferedInputStream in = new BufferedInputStream(new FileInputStream());
try {
boolean first = true;
for(int b; (b = in.read()) >= 0;) {
if (b == 0xF0 && !first)
System.out.println();
first = false;
System.out.printf("%x ", b);
}
} finally {
in.close();
System.out.println();
}
如果文件是十六进制文本,则可以执行
String text = FileUtils.readFileAsString(file, "iso-8859-1");
text = text.replaceAll(" f0", "\nf0");
FileUtils.writeStringToFile(file2, text);
或将其划分为可以执行的行
String text = FileUtils.readFileAsString(file, "iso-8859-1");
BufferedReader br = new BufferedReader(new StringReader(text.replaceAll(" f0", "\nf0")));
for(String line; (line = br.readLine()) != null;) {
// process one line
}
使用FileUtils或您自己的方法做同样的事情。
答案 1 :(得分:0)
List<String> list = new ArrayList<>();
StringBuilder strb = new StringBuilder();
while((readHexFile = in.read()) != -1) {
String str = Integer.toHexString(readHexFile);
if (str.equals("f0")) {
String string = strb.toString();
if (!string.isEmpty()) {
list.add(new String("f0" + string)); // here
}
strb = new StringBuilder();
} else {
strb.append(str);
}
}
String string = strb.toString();
if (!string.isEmpty()) {
list.add(new String("f0" + string)); // here
}
// now you have all the strings in the list.
答案 2 :(得分:0)
为什么不直接将hex文件转换为字符串并执行字符串操作?
使用FileReader并将文件作为一个大字符串读入内存(如果文件大小合适)。在底层的InputStringReader中,必须指定US-ASCII,才能使用默认的UTF-16。然后用ASCII中的f0值对应的字符执行string.split(),这是冰岛ð:
char f0 = 'ð';
BufferedReader reader = new BufferedReader(new FileReader(new InputStreamReader(new FileInputStream(file), "US-ASCII")));
//read reader into string, trivial...
String[] split = readString.split(f0);
for(String s : split){
s = 'ð' + s;
//do your work on the string here
}