C#查找字节模式的偏移量,检查特定字节,更改字节,导出字节数组的部分

时间:2015-01-29 20:32:16

标签: c# arrays byte bytearray offset

这可能很长。我有一个二进制文件,其中包含一些信息。

我想做什么:

  1. 从OpenFileDialog
  2. 读取文件(二进制)
  3. 我现在正在搜索此文件中的特定字节
  4. 我正在获得该字节的偏移量,然后我正在检查offset + 2
  5. 的字节值
  6. 基本if if(如果偏移量+2值为0x08,则执行此操作,否则执行此操作)
  7. 现在,搜索另一个字节模式的偏移量。
  8. 复制从该偏移量到文件末尾的所有内容
  9. 将复制的字节数组保存到文件中。
  10. 所以,这是我的每一步的代码。 第一步: 1。

            Byte[] bytes;
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.ShowDialog();
            path = ofd.FileName;
            bytes = File.ReadAllBytes(path);
    

    第二步,在此文件中搜索特定模式。我在Stackoverflow上使用了一些帮助,最后得到了这个:

    来自stackoverflow的VOID:

            static public List<int> SearchBytePattern(byte[] pattern, byte[] bytes)
        {
            List<int> positions = new List<int>();
            int patternLength = pattern.Length;
            int totalLength = bytes.Length;
            byte firstMatchByte = pattern[0];
            for (int i = 0; i < totalLength; i++)
            {
                if (firstMatchByte == bytes[i] && totalLength - i >= patternLength)
                {
                    byte[] match = new byte[patternLength];
                    Array.Copy(bytes, i, match, 0, patternLength);
                    if (match.SequenceEqual<byte>(pattern))
                    {
                        positions.Add(i);
                        i += patternLength - 1;
                    }
                }
            }
            return positions;
        }
    

    我搜索模式的空白:

            void CheckCamera()
        {
            Byte[] szukajkamera = { 0x02, 0x00, 0x08, 0x00, 0x20};
            List<int> positions = SearchBytePattern(szukajkamera, bytes);
            foreach (var item in positions){
                MessageBox.Show(item.ToString("X2"));
                IndexCamera = item;
            }
            int OffsetCameraCheck = IndexCamera + 2;
        }
    

    项目现在是我的偏移量,其中02 00 08 00 20存档。 现在,我如何检查,如果bytes(offset = IndexCamera + 2)== 0x08? 我可以做array.IndexOf,但在08之前有很多08我正在寻找。

    对于第5步,我也在做这件事,但是当Buffer.BlockCopy问我长度时,我无法做到。 对于第5步和前进,我需要在同一个文件中再次搜索另一个模式,获取它的偏移量并从该偏移量复制到结束。如果我想这样,那么我需要将buffer.blockcopy转换为非空字节数组,但我只需要它为空!我完全失去了它。请帮我。 谢谢!

2 个答案:

答案 0 :(得分:1)

进行模式搜索时,上述答案确实有效,但您需要对其进行调整以搜索更多模式。

例如: 如果您正在寻找08 1D 1A AA 43 88 33

的位置 那么你需要像:

public static unsafe long IndexOf(this byte[] haystack, byte[] needle, long startOffset = 0)
{ 
    fixed (byte* h = haystack) fixed (byte* n = needle)
    {
        for (byte* hNext = h + startOffset, hEnd = h + haystack.LongLength + 1 - needle.LongLength, nEnd = n + needle.LongLength; hNext < hEnd; hNext++)
            for (byte* hInc = hNext, nInc = n; *nInc == *hInc; hInc++)
                if (++nInc == nEnd)
                    return hNext - h;
        return -1;
    }
}

注意:感谢撰写此代码的Dylan Nicholson。

答案 1 :(得分:0)

我该怎么做字节(offset = IndexCamera + 2)== 0x08?

if(bytes[IndexCamera+2] == 0x08)....