我正在尝试编写一个程序,我可以:
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");
}
答案 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 - 防弹,模数任何错误:-)