C# 如何解释二进制文件

C# 如何解释二进制文件,c#,binaryfiles,binary-data,C#,Binaryfiles,Binary Data,我有一个二进制文件,我想打开,阅读和理解;但我以前从未尝试过处理二进制信息 各种问题(包括和 )帮助我打开并阅读该文件,但我不知道如何解释到目前为止提取的信息 我从中得到一些有希望的数据的一种方法是: using (BinaryReader reader = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read))) { for (int i = 0; i < 100; i++) {

我有一个二进制文件,我想打开,阅读和理解;但我以前从未尝试过处理二进制信息

各种问题(包括和 )帮助我打开并阅读该文件,但我不知道如何解释到目前为止提取的信息

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

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);
    }
}
但这并不是我所期望的,我甚至不知道这意味着什么——我是否成功地确定文件包含一组数字,或者我正在查看数据的解释(类似于使用错误/不同的编码将为相同的输入返回不同的字符)


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

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

例如,如果向二进制文件写入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);
}

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


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

例如,如果向二进制文件写入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);
}

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


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

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

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

你可以考虑改变你的循环使用Read Byg而不是Realt32,所以它看起来可能是这样……/P>

bValue = reader.ReadByte();
sb.AppendFormat("{1}=0x{2:X}{0}", Environment.NewLine, i, bValue);
因此,您将文件视为一个字节序列,并以十六进制而不是十进制数写出数据

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

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


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

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

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

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

你可以考虑改变你的循环使用Read Byg而不是Realt32,所以它看起来可能是这样……/P>

bValue = reader.ReadByte();
sb.AppendFormat("{1}=0x{2:X}{0}", Environment.NewLine, i, bValue);
因此,您将文件视为一个字节序列,并以十六进制而不是十进制数写出数据

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

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


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

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