繁体   English   中英

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

[英]C# Find offset of byte pattern, check specific byte, change byte, export part of byte array

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

我想做的事:

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

因此,这是我每一步的代码。 步骤一 :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缓存到非空字节数组,但是我只需要将其清空即可! 我完全失去了它。 请帮我。 谢谢!

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

例如:如果您要查找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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM