我正在尝试编写一个程序,我可以:
- 加载文件
- 输入要从中扫描数据的开始和开始偏移地址
- 扫描该偏移范围以搜索特定的字节序列(例如"05805A6C")
- 检索每个匹配项的偏移量并将它们写入.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;
}
...