下面的代码显示了在文件中搜索特定模式....无论如何,我可以添加到此代码中,以便我可以搜索可能的四种模式。
所以,如果它与第一个不匹配,那么它会查看它是否与第二个相匹配,等等....
非常感谢。
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();
的 的 ** * ** * ** * 的** 编辑 * ** * ** * ** * * < /强>
在运行程序时,我插入了一个断点来查看数组存储的内容....这就是它报告的内容
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
模式结果似乎都在那里,我是否认为这是一个二维数组? ......如果是这样的话,我可以将它放在一个阵列中吗?
非常感谢
答案 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;
//}
}
[edit]这是一个以列表形式返回所有有效匹配的函数:
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;
}
答案 1 :(得分: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。