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

小编典典

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

/**

* 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;

}

}

2020-09-16

小编典典 不,没有内置方法可以做到这一点。但是,直接从此处复制(对原始代码有两个修复): /** * 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; } } 2020-09-16
经验分享 程序员 微信小程序 职场和发展