2011-12-17 68 views
0

我有一个数据库存储在不同文件头的内存中。我想测试一个给定文件的签名,例如一个.jpg到数据库中的签名。如何将文件签名与签名数据库进行比较?

考虑到这种情况,要测试的文件的签名是FFD8FFE0,但是在数据库中,只有部分匹配的FFD8FF签名,有时候数据库也有FFD8签名,但是对于不同的类型,但是具有相同的文件格式。 如何正确检索测试文件的正确匹配签名?

我写了下面的函数,但它并不适用于所有文件格式。

public static boolean searchSignature(File file, List<FileSignature> db) throws FileNotFoundException, IOException { 

     byte[] buffer = new byte[MAX_SIGNATURE_SIZE]; 
     InputStream in = new FileInputStream(file); 
     int n = in.read(buffer, 0, MAX_SIGNATURE_SIZE); 
     String hex = toHex(buffer); 
     boolean b = true; 

     // for each signature in the database, compare it with file's siganture 
     for (FileSignature fs : db) { 
      if (!fs.getSignature().contains(hex)) { 
       b = false; 

      } 
     } 
     return b; 
    } 
+0

简短评论:你应该关闭()你的输入流! – fge 2011-12-17 10:26:55

+0

另外,你使用`contains()`:它将匹配字符串中的任何地方。你确定你不是指`startsWith()`,即`hex.startsWith(fs.getSignature())`? – fge 2011-12-17 10:27:46

回答

1

你的条件应该是

if (hex.startsWith(fs.getSignature()) 

由于六角长于从DB签名。

如果您同时拥有FFD8FF和FFD8,则无法区分长签名和短签名。

相关问题