如何在C#中使用BinaryReader一次读取二进制数据?

时间:2014-02-24 01:02:44

标签: c# binaryreader

所有

我很难处理二进制数据。

我正在研究MSDN的一些代码。

服务器端:

        string fileName = "AppSettings.dat";

        using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
        {
            writer.Write(1.250F);
            writer.Write(@"c:\Temp");
            writer.Write(10);
            writer.Write(true);
        }

我从服务器收到了二进制文件。

        string clientFile = "AppSettings.dat";

        using (BinaryReader reader = new BinaryReader(File.Open(clientFile, FileMode.Open)))
        {
            float aspectRatio = reader.ReadSingle();
            string tempDirectory = reader.ReadString();
            int autoSaveTime = reader.ReadInt32();
            bool showStatusBar = reader.ReadBoolean();
        }

使用BinaryWriter和BinaryReader类时,读起来很容易。

但是,这是我的问题。

服务器开发人员离开了公司,不知怎的,任何人都无法与他联系。

我无法弄清楚他是如何写信给BinaryWriter的。

我指的是确切的顺序。

在示例中,我必须按顺序阅读阅读器

ReadSingle

ReadString

ReadInt32

ReadBoolean

然后我可以得到正确的结果。

但在我的情况下,我不知道确切的顺序。

所以,我可以尝试的是如何一次读取所有字符和数字。

像......

string contents = reader.someMethod;

然后内容如下:

1.250F
c:\Temp
10
true

回车是可以跳过的。

修改

我尝试过File.ReadAllBytes。

但结果并非我期望的结果......

        byte[] bytes    = System.IO.File.ReadAllBytes(clientFile);
        string contents = Encoding.UTF8.GetString(bytes);

\ 0 \ 0 \交流?:\温度\ n \ 0 \ 0 \ 0

2 个答案:

答案 0 :(得分:2)

我担心不知道正确的顺序;然后你将很难解决这个问题。

我建议使用.net反编译器来读取他的代码。我假设代码归贵公司所有,所以这可能没有错。

RedGates反射器和Resharper都具有将.net程序集反编译为C#的功能。

还有一个免费的来自Telerik的'dotPeek',我被告知它非常好但我自己没有用过。

基本上你只是运行程序并给它组装,你可以浏览源代码,只要它没有被混淆;但即便如此 - 有些操作无法完全混淆,例如binaryWriter.Write,因为它们必须按特定顺序发生。

如果这不是您所需要的,请尝试澄清您的问题!

希望这有帮助。

答案 1 :(得分:2)

下面的代码写入一个二进制文件,然后将其读入一个字节数组并输出十六进制值。

using (var writer = new BinaryWriter(File.Create("foo.bin")))
{
    writer.Write(1.250F);
    writer.Write(@"c:\Temp");
    writer.Write(10);
    writer.Write(true);
}

var bytes = File.ReadAllBytes("foo.bin");
var text = BitConverter.ToString(bytes);
Console.WriteLine(text);

这是输出:

00-00-A0-3F-07-63-3A-5C-54-65-6D-70-0A-00-00-00-01

解码,我们有:

0000A03f - 4 bytes = 1.250F

接下来是对应于字符串“c:\ Temp”的8个字节。第一个字节07是长度。 BinaryWriter对长度使用7位编码方案,因此短于128字节的字符串只需要一个长度字节。组成字符串的7个字符遵循长度字节。

之后你有四个字节0A000000,它是整数10。

最后,你有值1,这是布尔值True。

您应该使用BitConverter.ToString(bytes)输出文件中的数据。然后你可以直接检查字节。

如果您对文件中的内容有所了解,通常可以解决它。字符串很容易被挑选出来,你可以经常使用它们作为锚点来弄清楚它们两侧的内容。如果您了解文件中的内容并且只是想弄清楚事物的编写顺序,则尤其如此。

你真的不需要一个反编译器来弄清楚他写的东西的顺序。你可以使用ildasm.exe来检查生成的MSIL。对BinaryWriter.Write的函数调用很容易发现,反汇编的代码会告诉你它是在写一个字符串,布尔,整数等。对于一次性的事情,这就是我要去的方式。如果我有一份更大的工作需要理解很多代码,我会选择一个更好的反编译器。