这可能很长。我有一个二进制文件,其中包含一些信息。
我想做什么:
所以,这是我的每一步的代码。 第一步: 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转换为非空字节数组,但我只需要它为空!我完全失去了它。请帮我。 谢谢!
答案 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)....