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

时间:2016-02-07 02:16:00

标签: java arrays swing

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

  1. 加载文件
  2. 输入起始和起始偏移地址从
  3. 扫描数据的位置
  4. 扫描该偏移范围以搜索特定的字节序列(例如“05805A6C”)
  5. 检索每个匹配的偏移量并将其写入.txt文件
  6. i66.tinypic.com/2zelef5.png

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

    我正在使用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");
        }
    

2 个答案:

答案 0 :(得分: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;
}
 ...

答案 1 :(得分:1)

这是一种防弹的 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 - 防弹,模数任何错误:-)