如何在内存池中找到一个字节序列?

时间:2014-03-23 03:19:34

标签: c#

我正在寻找一种在更大的字节数组中搜索N个连续字节的方法。

这是我迄今为止的一次尝试。

public int FindOffset() {
    byte[] bytesToFind = new byte[] { 0x77, 0x35, 0x94, 0x00 };
    int currentOffset = 0;
    for(;;) {
        byte[] mem = MemoryReader.Read(currentOffset, 4);
        if(bytesToFind == mem || mem == bytesToFind)
        {
            MessageBox.Show(Offset.ToString());
            break;
        }
        currentOffset++;
    }
    return currentOffset;
}

MemoryReader.Read返回一个字节数组。

2 个答案:

答案 0 :(得分:3)

  1. 字节数组是引用类型。因此==运算符比较指针而不是实际值。要更正它,请比较每个值:Test[0] == mem[0] && Test[1] == mem[1] && Test[2] == mem[2] && Test[3] == mem[3]
  2. 您应该使用其他算法(例如Knuth–Morris–Pratt algorithm

答案 1 :(得分:1)

我认为你几乎就在那里。您需要比较引用,而不是比较数组值。使用Enumerable.SequenceEqual完成工作。

for(int Offset =0;Offset<Writer.Length;Offset++)
{
    byte[] mem = Save.Read(Offset, 4);
    if(mem.SequenceEqual(Test))
    {
        MessageBox.Show(Offset.ToString());
        break;
    }
}