首页 文章

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

提问于
浏览
0

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

各种问题(包括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 回答

  • 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/

  • 2

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

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

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

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

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

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

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

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

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

相关问题