【发布时间】:2013-04-20 00:03:29
【问题描述】:
有
List<byte> lbyte
有
byte[] searchBytes
如何在 lbyte 中不仅搜索单个字节,还搜索 searchBytes 的索引?
例如
Int32 index = lbyte.FirstIndexOf(searchBytes);
这是我想出的蛮力。
不是我正在寻找的性能。
public static Int32 ListIndexOfArray(List<byte> lb, byte[] sbs)
{
if (sbs == null) return -1;
if (sbs.Length == 0) return -1;
if (sbs.Length > 8) return -1;
if (sbs.Length == 1) return lb.FirstOrDefault(x => x == sbs[0]);
Int32 sbsLen = sbs.Length;
Int32 sbsCurMatch = 0;
for (int i = 0; i < lb.Count; i++)
{
if (lb[i] == sbs[sbsCurMatch])
{
sbsCurMatch++;
if (sbsCurMatch == sbsLen)
{
//int index = lb.FindIndex(e => sbs.All(f => f.Equals(e))); // fails to find a match
IndexOfArray = i - sbsLen + 1;
return;
}
}
else
{
sbsCurMatch = 0;
}
}
return -1;
}
【问题讨论】:
-
@YairNevet 字节列表
-
@YairNevet 另一个字节列表,这本质上是orderedlist.containssequence 这里必须有一个很好的解决方案,因为它基本上是用string.contains 解决的,但这是一个更通用的情况
-
尝试寻找here 的扩展方法来执行此操作。
-
你确定你的暴力破解方法是正确的吗?看起来它没有检查搜索字符串的最后一个字符。所以在寻找“frob”时,如果只检查“fro”。我想你想增加
sbsCurMatch在长度检查。就目前而言,它会在一个字符的字符串上失败。