在另一个byte []中找到byte []的最简单方法是什么?我有一种感觉,我可以用linq做,但我不知道如何。
注意:我使用[c#]
进行搜索但没有找到任何内容,我感到很惊讶。
答案 0 :(得分:18)
这是Ergwun's excellent answer的更快版本:
static int SearchBytes( byte[] haystack, byte[] needle ) {
var len = needle.Length;
var limit = haystack.Length - len;
for( var i = 0; i <= limit; i++ ) {
var k = 0;
for( ; k < len; k++ ) {
if( needle[k] != haystack[i+k] ) break;
}
if( k == len ) return i;
}
return -1;
}
在一个11MB干草堆和9字节针的短暂测试中,这个速度提高了大约三倍。
优化是:
match()
开头的冗余长度测试。当然对于长字节数组,你想要使用类似Boyer-Moore搜索的东西,但是出于很多目的,这样的简单算法已经足够好了,它具有简短易懂的优点。并验证。
答案 1 :(得分:8)
这是一种简单(天真?)的方式:
static int search(byte[] haystack, byte[] needle)
{
for (int i = 0; i <= haystack.Length - needle.Length; i++)
{
if (match(haystack, needle, i))
{
return i;
}
}
return -1;
}
static bool match(byte[] haystack, byte[] needle, int start)
{
if (needle.Length + start > haystack.Length)
{
return false;
}
else
{
for (int i = 0; i < needle.Length; i++)
{
if (needle[i] != haystack[i + start])
{
return false;
}
}
return true;
}
}
答案 2 :(得分:0)
使用lambda表达式尝试这个:
private bool CheckPatternInArray(byte[] array, byte[] pattern)
{
int fidx = 0;
int result = Array.FindIndex(array, 0, array.Length, (byte b) =>
{
fidx = (b == pattern[fidx]) ? fidx + 1 : 0;
return (fidx == pattern.Length);
});
return (result >= pattern.Length - 1);
}
如果您追求最快的解决方案,请查看解决方案here。
答案 3 :(得分:-2)
你可能自己想过这个,但有时候我喜欢做简单的事情。
bool found = false;
int i = 0;
for(; i < byteArray.Length || found; i++)
{
if(byteArray[i] == lookingFor)
{
found = true;
}
}