【问题标题】:Hex Value Find with C#使用 C# 查找十六进制值
【发布时间】:2014-07-26 10:37:41
【问题描述】:

我正在尝试在文件中搜索十六进制值,如果存在该值,我需要从找到的位置复制 char 的 16 个字节。我正在尝试在 C# 中做同样的事情。

请在下面找到我尝试过的代码,不胜感激。

BinaryReader bw = new BinaryReader(File.OpenRead(filepath));
byte[] bc = { 0xa0, 0x00, 0x00, 0x03 };
for (int i = 0; i < br.BaseStream.Length-10;i++)
{

if (bw.ReadUInt32() == 0xa00003)
{
    Console.WriteLine("Found @ {0}", i);

}

bw.Close();

我收到如下错误:

“System.IO.EndOfStreamException”类型的未处理异常 发生在 mscorlib.dll 中

附加信息:无法读取超出流末尾的内容。

【问题讨论】:

  • “16 字节的字符”是什么意思?字符和字节有很大的不同,你需要确切地知道你想要什么。我怀疑您的错误是因为您一次读取 4 个字节,但读取 (length-in-byte - 10) 次。
  • 包含 16 个字符的字符串
  • 啊,那可能超过 16 个字节......你需要知道正在使用什么编码。你知道吗?
  • 我只需要获取 16 个字节,并通过控制台将其显示为字符串。我不知道
  • 你需要找出答案。这 16 个字节 实际上是 文本,还是需要将它们转换为十六进制?您要查找的 4 字节序列肯定在 4 字节边界上吗?

标签: c# search hex


【解决方案1】:

错误是由于您的for 循环的步长等于 1 并且您一次读取 4 个字节。阅读后,Stream 位置提前了 4。将您的 for 循环更改为以下之一:

for (int i = 0; i < br.BaseStream.Length - 10; i += 4)
{
    //...
}

编辑:

如果你想在每个位置搜索而不每次跳过4个字节,请使用以下代码:

    Stream f = File.OpenRead(fileName);
    BinaryReader br = new BinaryReader(f);
    for (int i = 0; i < f.Length - 10; i++)
    {
        f.Seek(i, SeekOrigin.Begin);
        if (br.ReadUInt32() == 0xa00003)
        {
            Console.WriteLine("Found @ {0}", i);
        }
    }
    br.Close();

【讨论】:

  • 在编辑后的版本中,我仍然遇到同样的错误。
  • 您在哪一步得到错误?什么是“编辑版”?您可以将新版本附加到初始帖子中。
  • 让我重新定义我的问题。步骤1。我正在寻找一个签名十六进制值,它是 0x030000A0。我需要在文件中搜索它。第2步。如果我发现我需要寻找那个位置并将 16 字节的字符串值提取到控制台。
  • 那么f.Length - 10应该改为f.Length - 16,因为你不能从f.Length - 10位置读取16个字节。
  • 首先我们整理一下hex值的标识,并尝试在文件中定位,在Console中找出偏移量。
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 2010-10-03
  • 2018-07-26
  • 1970-01-01
  • 2011-08-04
  • 2012-07-01
  • 2011-06-01
相关资源
最近更新 更多