我需要检查二进制文件中的内容是否在其他二进制文件中。
我试图将两个文件内容复制到一个带有fread的字符数组中并使用strstr检查它们,但是strstr总是返回NULL,即使该内容应该在另一个文件中找到。
有什么想法吗?
感谢。
答案 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;
}