如何在 bin 文件的字节数组 [] 中搜索字节序列



我正在尝试编写一个程序,我可以:

  1. 加载文件
  2. 输入要从中扫描数据的开始和开始偏移地址
  3. 扫描该偏移范围以搜索特定的字节序列(例如"05805A6C")
  4. 检索每个匹配项的偏移量并将它们写入.txt文件

i66.tinypic.com/2zelef5.png

如图所示,我需要在文件中搜索"05805A6C",然后将偏移量"0x21F0"打印到.txt文件中。

我正在使用Java Swing。到目前为止,我已经能够将文件加载为 Byte 数组[]。但是我还没有找到一种方法来搜索特定的字节序列,也没有在偏移量范围之间设置搜索。

这是我的代码,它打开并将文件读取到字节数组[]

public class Read {
static public byte[] readBytesFromFile () {
  try {  
    JFileChooser chooser = new JFileChooser();
    int returnVal = chooser.showOpenDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
        FileInputStream input = new FileInputStream(chooser.getSelectedFile());
        byte[] data = new byte[input.available()];
        input.read(data);
        input.close();
        return data;
     }
     return null;
  }
  catch (IOException e) {
    System.out.println("Unable to read bytes: " + e.getMessage());
    return null;
  }
 }
}

还有我的代码,我尝试在字节中搜索。

byte[] model = Read.readBytesFromFile();
    String x = new String(model);
    boolean found = false;
    for (int i = 0; i < model.length; i++) {
        if(x.contains("05805A6C")){
            found = true;
        }
   }
    if(found == true){
        System.out.println("Yes");
    }else{
        System.out.println("No");
    }
以下是在

字节数组中搜索字节序列的防弹1 方法:

public boolean find(byte[] buffer, byte[] key) {
    for (int i = 0; i <= buffer.length - key.length; i++) {
        int j = 0;
        while (j < key.length && buffer[i + j] == key[j]) {
            j++;
        }
        if (j == key.length) {
           return true;
        }
    }
    return false;
}

对于大规模搜索,有更有效的方法可以做到这一点;例如使用Boyer-Moore算法。 然而:

  • 将字节数组转换为字符串并使用 Java 字符串搜索并不是更有效,并且它可能是脆弱的,具体取决于您在将字节转换为字符串时使用的编码。

  • 将字节数组转换为十六进制编码字符串的效率更低......和记忆饥渴...虽然如果你有足够的内存,就不会脆弱。 (在进行转换时,您可能需要多达 5 倍的内存作为文件大小......


1 - 防弹,模化任何错误:-)

编辑 似乎系统之间的字符集不同,因此您可能会得到不同的结果,因此我使用另一种方法进行处理:

String x = HexBin.encode(model);
String b = new String("058a5a6c");
int index = 0;
while((index = x.indexOf(b,index)) != -1 )
{
    System.out.println("0x"+Integer.toHexString(index/2));
    index = index + 2;
}
 ...

最新更新