从二进制文件中的索引获取偏移量
本文关键字:获取 偏移量 索引 二进制文件 | 更新日期: 2023-09-27 17:53:29
我正在寻找二进制文件中的值,其位置在二进制文件的索引中。我正在使用下面的代码,它不能让我从二进制文件中得到正确的字节。
long offset = 0;
//Open read stream
Stream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader brFile = new BinaryReader(fileStream);
//Read index to find start position
fileStream.Seek(0xC, SeekOrigin.Begin);
byte[] b = brFile.ReadBytes(4);
//Convert to long value
for (int x = 0; x < byErr.Length; x++)
offset = System.Convert.ToInt64(b[x].ToString()); //I'm assuming this is the problem
//Cleanup
fileStream.Flush();
b = null;
//Read needed value
fileStream.Position = offset;
fileStream.Seek(-0x60, SeekOrigin.Current); //The value I need is 0x60 BEFORE the index location
b = brFile.ReadBytes(4);
//Cleanup
fileStream.Flush();
fileStream.Close();
brFile.Close();
我从第一次读取得到正确的值,在0xC
,但我没有正确转换偏移量。我试着把它转换成一个字符串,首先得到正确的字符串值,但当我试图让它长搜索错误的区域。还请注意,我需要的数据实际上是ox60
在二进制中给我的索引位置之前。
是的,这就是问题所在:
for (int x = 0; x < byErr.Length; x++)
{
offset = System.Convert.ToInt64(b[x].ToString());
}
您将索引的每个字节单独转换为字符串,然后解析它并将其分配给offset
。所以实际上只有最后一个字节会被使用。
你可以试试:
long offset = br.ReadInt32();
而不是开始调用ReadBytes(4)
。如果使用了错误的端序,您可以使用MiscUtil中的EndianBinaryReader
类。
您应该记录一些诊断信息,以显示您已读取的索引,并将其与您期望的索引进行比较。
我还建议您将查找代码更改为:
fileStream.Position = offset - 60;
简单。此外,刷新正在读取的文件流并将b
设置为null是不必要的,您应该为FileStream
使用using
语句,此时您不需要手动关闭任何东西。
嗯,我发现这个使用谷歌,http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ab831d92-14ad-437e-9b03-102d90f44d22/,并得到它的工作为我所需要的。我从字节转换到字符串到长,所以这似乎绝对不是最有效的方式,但它工作得很完美。我还意识到,当我试图给它一个十六进制偏移量时,。position和。seek要求一个十进制值。
public static string HexStr(byte[] p)
{
char[] c = new char[p.Length * 2 + 2];
byte b;
c[0] = '0'; c[1] = 'x';
for (int y = 0, x = 2; y < p.Length; ++y, ++x)
{
b = ((byte)(p[y] >> 4));
c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30);
b = ((byte)(p[y] & 0xF));
c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30);
}
return new string(c);
}
现在我的代码看起来像这样....
using (Stream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
BinaryReader brFile = new BinaryReader(fileStream);
//Read index to find start position
fileStream.Position = 0xC;
byte[] offsetByte = brFile.ReadBytes(4);
string offsetString = HexStr(offsetByte);
long offset = System.Convert.ToInt64(offsetString, 16);
//Read needed value
fileStream.Position = offset - 96; //-0x60 translates to -96
byte[] byVal = brFile.ReadBytes(4);
}