如何解释二进制文件的二进制文件

时间:2015-08-10 01:00:55

标签: c# binaryfiles binary-data

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

各种问题(包括Using structs in C# to read dataHow 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

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

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

2 个答案:

答案 0 :(得分:3)

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

例如,如果你写一个二进制文件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文件是更简单的二进制格式之一:

Diagram of the .WAV file format

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

答案 1 :(得分:2)

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

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

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

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

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

所以你将文件视为一个字节序列,并以十六进制而不是十进制数字写出数据。

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

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

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