[英]C# Find offset of byte pattern, check specific byte, change byte, export part of byte array
这可能很长。 我确实有一个二进制文件,其中包含一些信息。
我想做的事:
因此,这是我每一步的代码。 步骤一 :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.