【问题标题】:How to Interpret Binary a Binary File如何解释二进制文件
【发布时间】:2015-08-10 01:00:54
【问题描述】:

我有一个想要打开、阅读和理解的二进制文件;但我以前从未尝试过使用二进制信息。

各种问题(包括Using structs in C# to read data 和 How to read a binary file using c#?) 帮助我打开并阅读了文件,但我不知道如何解释我到目前为止提取的信息。

我从中获得了一些有希望的数据的一种方法是:

using (BinaryReader reader = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read)))
{
    for (int i = 0; i < 100; i++)
    {
        iValue = reader.ReadInt32();
        sb.AppendFormat("{1}={2}{0}", Environment.NewLine, i, iValue);
    }
}

返回如下内容:

0=374014592
1=671183229
2=558694987
3=-1018526206
4=1414798970
5=650
6=4718677
7=44
8=0
9=7077888
10=7864460

但这不是我所期望的,我什至不知道这意味着什么 - 我是否成功确定文件包含一堆数字,或者我是否正在查看数据的解释(类似于如何使用错误/不同的编码将为相同的输入返回不同的字符)。

我还有希望还是应该完全停止?

【问题讨论】:

  • 是的,您正在查看将其视为整数列表的数据的解释。如果您想知道“正确”的解释是什么,您需要知道文件的格式是什么。
  • 我会尝试将其作为字节列表而不是 Int32 读取,然后对它们应用 ASCII 解码。或者更简单地说,使用记事本打开文件。这不会让你一路走到那里,但其中可能有一些实际文本可能会给你一个关于其余部分结构的线索。

标签: c# binaryfiles binary-data


【解决方案1】:

您必须已经知道二进制文件的结构,才能正确读取和解释文件。

例如,如果您将 int、double、boolean 和 string 写入二进制文件,如下所示:

 int i = 25;
 double d = 3.14157;
 bool b = true;
 string s = "I am happy";    

using (var bw = new BinaryWriter(new FileStream("mydata", FileMode.Create))
{           
    bw.Write(i);
    bw.Write(d);
    bw.Write(b);
    bw.Write(s);
}

然后您必须稍后使用相同类型以完全相同的顺序读回数据值:

using (var br = new BinaryReader(new FileStream("mydata", FileMode.Open)))
{
    i = br.ReadInt32();
    Console.WriteLine("Integer data: {0}", i);
    d = br.ReadDouble();
    Console.WriteLine("Double data: {0}", d);
    b = br.ReadBoolean();
    Console.WriteLine("Boolean data: {0}", b);
    s = br.ReadString();
    Console.WriteLine("String data: {0}", s);
}

http://www.tutorialspoint.com/csharp/csharp_binary_files.htm

您需要了解以下内容才能成功读取 .WAV 文件(一种包含声音信息的二进制文件格式)。 WAV 文件是较简单的二进制格式之一:

http://soundfile.sapp.org/doc/WaveFormat/

【讨论】:

  • 好的,所以在不了解结构的情况下,我基本上是在浪费时间? IE。有没有办法解决文件结构?
  • 您知道文件包含什么内容吗?如果不知道文件的内容是什么,我看不出它在任何有意义的编程环境中对您有什么用处。
  • 我期待键值对。这是一个业余爱好项目(不是邪恶的,诚实的!)所以不是真正的戏剧。它更像是一种学习机会。
  • 这就是你掌握的所有信息吗?是一些固定长度类型的键和值,还是它们是可变长度的?文件中有字段长度信息吗?
  • 感谢迄今为止提供的宝贵帮助,它帮助我理解了我正在阅读的其他一些答案。我将对文件格式进行一些额外的挖掘。我知道(游戏)社区中的其他人已经解析了它,但他们所有的实现都是用 python 和其他语言实现的。
【解决方案2】:

根据定义,二进制文件只是一系列位。您是否将这些位解释为数字、字符或其他内容,完全取决于最初写入文件的内容。

一般来说,通过查看文件内容无法判断写入文件的内容。当然,如果您将这些位解释为字符并获得可读文本,那么文本很可能就是写入文件的内容。但是只包含文本的文件通常不会被描述为二进制文件。

通过调用 ReadInt32,您假设文件的内容是一系列四字节整数。但是,如果将八字节整数或浮点数或枚举或其他内容写入文件怎么办?如果您的文件不包含四个字节的倍数怎么办?

您可能会考虑将循环更改为使用 ReadByte 而不是 ReadInt32,因此它可能看起来像这样......

bValue = reader.ReadByte();
sb.AppendFormat("{1}=0x{2:X}{0}", Environment.NewLine, i, bValue);

因此您将文件视为字节序列并以十六进制而不是十进制数写入数据。

另一种方法可能是找到一个好的十六进制编辑器并使用它来检查文件内容,而不是编写自己的代码(至少开始时)。

Visual Studio 中内置了一个简单的十六进制编辑器(假设您正在使用该编辑器)。转到文件 | 打开 | 打开文件。然后在“打开文件”对话框中选择您的二进制文件,然后单击“打开”按钮右侧的下拉菜单并选择Open With,然后选择Binary Editor。。 p>

您将看到以十六进制和字符显示的文件内容。不是很好,但很快。

【讨论】:

  • 干杯,我也试试看。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 2018-10-28
  • 1970-01-01
  • 2018-03-23
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多