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

标签 java arrays swing

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

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

i66.tinypic.com/2zelef5.png

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

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

这是我的代码,用于打开文件并将其读入字节数组[]

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 - 防炸弹,以任何错误为模:-)

关于java - 如何在bin文件的字节数组[]中搜索字节序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35248973/

相关文章:

java - JFrame 不采用实际屏幕尺寸

java - Hibernate 和 MySQL 的创建时间戳和上次更新时间戳

javascript - Array.prototype.fill() 与 fill as I go 不同

arrays - 如何使用数组查找/替换选定单元格中的多个值?

java - 将字符串数组转换为字节数组

java - 将输入格式化程序和密码特征与 swing 一起使用

java - 如何强制 JTextArea 可编辑、可点击并立即刷新输出?

java - 在 Java 中重命名驱动器标签

java - JRuby/Warbler 导致没有这样的文件要加载 -- bundler/dep_proxy

java - 尝试进入同步块(synchronized block)时出现 IllegalStateException