从二进制文件中的索引获取偏移量

本文关键字:获取 偏移量 索引 二进制文件 | 更新日期: 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);
        }