【发布时间】:2015-01-29 20:32:15
【问题描述】:
这可能很长。我确实有一个二进制文件,其中包含一些信息。
我想做的事:
- 从 OpenFileDialog 读取文件(二进制)
- 我现在正在此文件中搜索特定字节
- 我正在获取该字节的偏移量,然后我正在检查偏移量+2 的字节值
- 基本if for(如果offset+2值是0x08,那么做这个,如果不是,那么做别的)
- 现在,搜索另一个字节模式的偏移量。
- 复制从该偏移量到文件末尾的所有内容
- 将复制的字节数组保存到文件中。
所以,这是我每一步的代码。 第一步: 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;
}
Item 现在是我的偏移量,其中 02 00 08 00 20 在文件中。 现在,我如何检查 bytes(offset=IndexCamera+2) == 0x08 ? 我可以做array.IndexOf,但是在我要找的08之前还有很多08。
对于第 5 步,我也在做这件事,但是当 Buffer.BlockCopy 询问我的长度时,这对我来说是不可能的。 对于第 5 步及以后的步骤,我需要在同一个文件中再次搜索另一个模式,获取它的偏移量并从该偏移量复制到最后。如果我愿意,那么我需要将 buffer.blockcopy 复制到非空字节数组,但我只需要它为空!我完全失去了它。请帮我。 谢谢!
【问题讨论】:
标签: c# arrays byte bytearray offset