2011-07-09 190 views
2

我的代码如下显示通过文件搜索特定模式....是否有无论如何,我可以添加到此代码,以便我可能可能搜索可能的四种模式。C#模式搜索

所以,如果它不匹配第一个,然后它看起来看它是否符合第二个等等....

非常感谢。

byte[] pattern = new byte[5] { 00, 00, 00, 08, 00 }; 
byte[] file = File.ReadAllBytes("C:\\123.cfg"); 

var result = Enumerable.Range(0, file.Length - pattern.Length + 1) 
       .Where(i => pattern.Select((b, j) => new { j, b }) 
            .All(p => file[i + p.j] == p.b)) 
       .Select(i => i + pattern.Length - 1); 

int[] PatternArray = result.ToArray(); 

** * ** * ** * **编辑* ** * ** * ** * *

运行程序I插入一个断点,看看有什么阵列存储....这是它报道

response Count = 6 System.Collections.Generic.List<int[]> 
    [0] {int[1]} int[] 
     [0] 1577 int 
    [1] {int[0]} int[] 
    [2] {int[0]} int[] 
    [3] {int[0]} int[] 
    [4] {int[0]} int[] 
    [5] {int[6]} int[] 
     [0] 31 int 
     [1] 246 int 
     [2] 448 int 
     [3] 663 int 
     [4] 864 int 
     [5] 1734 int 

模式的结果似乎都在那里,我是正确的思维,这是一个二维数组? ...如果是的话,无论如何,我可以在一个单一的阵列?

非常感谢

+1

还有一些比straigtforward 1-1匹配更好的方法http://en.wikipedia.org/wiki/String_searching_algorithm – driushkin

+0

你的病毒扫描器怎么样? ;) –

回答

3

创建的byte []和一个“匹配”布尔数组(或列表...或其他枚举),然后做你的周围模式搜索这样一个while循环:

List<byte[]> patterns = new List<byte[]>() 
{ 
    new byte[] { 00, 00, 00, 08, 00 }, 
    new byte[] { 00, 00, 00, 08, 01 }, 
    new byte[] { 00, 00, 00, 08, 02 }, 
    new byte[] { 00, 00, 00, 08, 03 } 
}; 

//bool matched = false; 
foreach (byte[] pattern in patterns) 
{ 
    //while (!matched) 
    //{ 
    byte[] file = File.ReadAllBytes("C:\\123.cfg"); 

    var result = Enumerable.Range(0, file.Length - pattern.Length + 1) 
        .Where(i => pattern.Select((b, j) => new { j, b }) 
             .All(p => file[i + p.j] == p.b)) 
        .Select(i => i + pattern.Length - 1); 

    int[] PatternArray = result.ToArray(); 
    // if (result != null) 
    //  matched = true; 
    //} 
} 

[编辑]这是返回所有以列表的有效匹配的功能:

public List<int[]> doPatternSearch() 
     { 

      List<byte[]> patterns = new List<byte[]>() { 
       new byte[] { 00, 00, 00, 08, 00 }, 
       new byte[] { 00, 00, 00, 08, 01 }, 
       new byte[] { 00, 00, 00, 08, 02 }, 
       new byte[] { 00, 00, 00, 08, 03 } 
       }; 
      //this becomes a container to hold all of the valid results 
      List<int[]> response = new List<int[]>(); 

      foreach (byte[] pattern in patterns) 
      { 
       byte[] file = File.ReadAllBytes("C:\\123.cfg"); 

       var result = Enumerable.Range(0, file.Length - pattern.Length + 1) 
         .Where(i => pattern.Select((b, j) => new { j, b }) 
             .All(p => file[i + p.j] == p.b)) 
         .Select(i => i + pattern.Length - 1); 

       if (result != null) 
       { 
        //if the result is not null then add it to the list. 
        response.Add(result.ToArray<int>()); 
       } 
      } 

      return response; 

     } 
+0

感谢您的回复,出于某种原因,如果它找到了一个匹配为“00,00,00,00,00”然后它似乎没有循环通过休息,看看是否有任何其他比赛。 – user826436

+0

当你说'如果它不匹配第一个,那么它看起来是否与第二个匹配,等等,这是我以为你要求它做。删除bool matched ...代码,找到一个匹配后不再停止。 –

+0

哦,对不起......当我删除bool matched = false; ...导致while循环出现问题 – user826436

0

ORegex几乎可以为你做这个。在字节序列与模式搜索一个小例子:

var oregex = new ORegex<byte>("{0}{1}{2}", x=> x==12, x=> x==3, x=> x==5); 
var toSearch = new byte[]{1,1,12,3,5,1,12,3,5,5,5,5}; 
           ^^^^^^ ^^^^^^ 
var foundTwoMatches = oregex.Matches(toSearch); 

还可以定义IComparable的对象并将其直接传递,而不使用labmda功能。

更多示例here