如何定位在.NET较大集合中的值(具体地,字节)的序列
题
我需要从文件解析字节,这样我只字节的某一序列已被鉴定后取的数据。例如,如果序列是简单地为0xFF(一个字节),那么我可以在收集使用LINQ:
byte[] allBytes = new byte[] {0x00, 0xFF, 0x01};
var importantBytes = allBytes.SkipWhile(byte b => b != 0xFF);
// importantBytes = {0xFF, 0x01}
但有以检测多字节序列的优雅的方式 - 例如为0xFF,0xFF的 - 尤其是在情况下,回溯它开始变得假阳性匹配
解决方案
我不知道任何内置的方式;按照往常一样,你总是可以编写自己的扩展方法。这里有一个我的头顶部(也有可能是更有效的方式来实现它):
public static IEnumerable<T> AfterSequence<T>(this IEnumerable<T> source,
T[] sequence)
{
bool sequenceFound = false;
Queue<T> currentSequence = new Queue<T>(sequence.Length);
foreach (T item in source)
{
if (sequenceFound)
{
yield return item;
}
else
{
currentSequence.Enqueue(item);
if (currentSequence.Count < sequence.Length)
continue;
if (currentSequence.Count > sequence.Length)
currentSequence.Dequeue();
if (currentSequence.SequenceEqual(sequence))
sequenceFound = true;
}
}
}
我要检查,以确保这是正确的,但它应该给你的基本理念;迭代通过元素,跟踪检索到的值的最后一个序列,设置一个标志,当该序列被发现,并且一旦该标志被设置,开始返回每个随后元素。
编辑 - 我并运行测试,并正确不工作。下面是一些测试代码:
static void Main(string[] args)
{
byte[] data = new byte[]
{
0x01, 0x02, 0x03, 0x04, 0x05,
0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA
};
byte[] sequence = new byte[] { 0x02, 0x03, 0x04, 0x05 };
foreach (byte b in data.AfterSequence(sequence))
{
Console.WriteLine(b);
}
Console.ReadLine();
}
其他提示
如果您将您的字节转换成一个字符串,你可以搜索内置于功能的无数的好处,即使你与实际上不是传统意义上的文字工作中的字节。
正如位理论;这是一个普通的语言问题。您可以使用正则表达式引擎检测到它。第一谷歌命中为“关于流的正则表达式”结果
http://codeguru.earthweb.com/columns/experts/article .PHP / c14689
不隶属于 StackOverflow