3

我有一个包含很多字节的十六进制文件,我需要根据特定字节拆分这些字节,例如

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);
    }  

}  

我成功拆分了模式,但是如何存储它并对它们中的每一个进行字符串操作

4

3 回答 3

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或您自己的方法来做类似的事情。

于 2012-12-05T15:20:13.577 回答
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.
于 2012-12-05T15:21:09.260 回答
0

为什么不直接将十六进制文件转换成字符串并进行字符串操作呢?

使用 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
}
于 2012-12-05T15:22:21.600 回答