java - 使用 Java 在二进制文件中搜索字节序列

标签 java search byte binaryfiles

我有一个字节序列,我必须使用 Java 在一组二进制文件中搜索。

示例:我正在二进制文件中搜索字节序列 DEADBEEF(十六进制)。 我将如何在 Java 中执行此操作?是否有内置方法,例如用于二进制文件的 String.contains()

最佳答案

不,没有内置方法可以做到这一点。但是,直接复制自HERE (对原始代码进行了两个修复):

/**
 * Knuth-Morris-Pratt Algorithm for Pattern Matching
 */
class KMPMatch {
    /**
     * Finds the first occurrence of the pattern in the text.
     */
    public static int indexOf(byte[] data, byte[] pattern) {
        if (data.length == 0) return -1;

        int[] failure = computeFailure(pattern);    
        int j = 0;

        for (int i = 0; i < data.length; i++) {
            while (j > 0 && pattern[j] != data[i]) {
                j = failure[j - 1];
            }
            if (pattern[j] == data[i]) { j++; }
            if (j == pattern.length) {
                return i - pattern.length + 1;
            }
        }
        return -1;
    }

    /**
     * Computes the failure function using a boot-strapping process,
     * where the pattern is matched against itself.
     */
    private static int[] computeFailure(byte[] pattern) {
        int[] failure = new int[pattern.length];

        int j = 0;
        for (int i = 1; i < pattern.length; i++) {
            while (j > 0 && pattern[j] != pattern[i]) {
                j = failure[j - 1];
            }
            if (pattern[j] == pattern[i]) {
                j++;
            }
            failure[i] = j;
        }

        return failure;
    }
}

关于java - 使用 Java 在二进制文件中搜索字节序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1507780/

相关文章:

java - 如何将我的 Web 应用程序同步到我的数据库?

java - fragment 选项卡主机有问题 - 它不起作用

java - BinarySearch 实现在某些情况下不起作用

android - 按下放大镜时如何调用onSearchRequested

go - 在Golang中将字节0附加到字节数组末尾的最佳方法

java - 使用 Java 扫描病毒签名

参数化类的java流返回数组

Java - FXML,CSS

delphi - 如何在通用 TList 中搜索具有特定字段值的记录?

java - 以 1024 字节的 block 分割 Java 字符串