如何检查二进制文件的内容是否在其他二进制文件中找到?

时间:2015-05-15 16:51:05

标签: c binary fread

我需要检查二进制文件中的内容是否在其他二进制文件中。

我试图将两个文件内容复制到一个带有fread的字符数组中并使用strstr检查它们,但是strstr总是返回NULL,即使该内容应该在另一个文件中找到。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

由于strstr函数在这里不能用于任意二进制数据(它仅适用于\0。终止的字符串),我可以在这里看到三种方法:
1)天真的方法:迭代一个字节数组,并使用memcmp,而另一个数组每次从不同的位置开始。容易,但消耗O(k*n)时间(k,n - 数据大小) 2)使用KMP algorithm。需要一些有关理解和编码的工作,但要给出最佳的时间复杂度O(k+n) 3)如果性能不重要,你不想搞乱任何有些非平凡的算法:
  - 将二进制数据转换为字符串,用两位数 HEX值表示每个字节。
  - 使用strstr

更新:在考虑第三种方法之后,可能会出现无法正常工作的情况。请考虑您要在AA AA内找到1A AA A1所代表的数据。它不应该被找到,因为它不在那里。但是,如果您将数据表示为没有分隔符的连接字符,则类似于AAAA中的1AAAA1,这将成功。所以添加一些分隔符在这里是个好主意。

答案 1 :(得分:0)

自己动手(如果有错误通知我):

/* Returns location of substring in string. If not found, return -1.
 * ssize_t is defined by POSIX. */
ssize_t bin_strstr(void* data, size_t len, void* subdata, size_t sublen) {
    len -= sublen;
    for ( ; len >= 1; --len)
        if (memcmp(data + len, subdata, sublen) == 0)
            return len;
    return memcmp(data, subdata, sublen) ? 0 : -1;
}