将具有多种数据类型的二进制文件解析为数组

时间:2016-02-13 18:42:24

标签: c# arrays split binary

我创建了多个二进制文件,每个文件包含2个字符串,2个字符,1个double和1个int。读取时的数据是

Fokker DR 1 
Germany 
D 
A 
1000.0 
13

二进制文件如下: dat file text

我正在尝试将dat文件解析为数组,因此我可以使用适当的名称标记每种数据类型,例如

Name: Fokker DR 1
Country: Germany
Attack Mode: D
Turn Mode: A
etc.

但是我遇到了麻烦,因为当尝试使用StreamReader并在空白的每个实例上拆分二进制文件时,由于名称(Fokker DR 1)包含多个不应该是空格的事实,我遇到了问题分裂。

以下是我尝试拆分的代码:

if (file.Contains("plane1"))
{
    StreamReader reader = new StreamReader("plane1.dat");
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        string[] data = line.Split(' ');
        bin.ReadBinary("plane1.dat");
        Console.WriteLine("Name: " + data[0]);
        Console.WriteLine("Country: " + data[1]);
        Console.WriteLine("Turn Mode: " + data[2]);
        Console.WriteLine("Attack Mode: " + data[3]);
        Console.WriteLine("Cost: " + data[4]);
        Console.WriteLine("Max Damage: " + data[5]);
    }
}

是否有任何方法可以在不同数据类型的每个实例中进行拆分,还是有另一种方法来标记二进制文件中的数据?

1 个答案:

答案 0 :(得分:2)

BinaryFormatter无法处理该文件格式。鉴于小尺寸和直接规格,一些ustom读取逻辑应该可以解决问题。

如果您使用BinaryReader打开文件,您可以自行决定如何处理您要阅读的下一个字节或字节。如果文件的格式不复杂,这很容易实现。根据您的规范,我创建了此代码来读取您的文件:

using(var br = new BinaryReader(
    File.Open(@"c:\tmp\plane.dat", FileMode.Open),
    Encoding.ASCII))
{
    while(br.BaseStream.Position < br.BaseStream.Length)
    {
        var name = br.ReadString();
        var country = br.ReadString();
        var turnmode = br.ReadChar();
        var attackmode = br.ReadChar();
        var cost = br.ReadDouble();
        var maxdamage = br.ReadInt32();

        // you can use above vars what ever you need to do 
        // with them, writing to the console or adding to 
        // a list for example
        // Planes.Add(new Plane {Name = name});
    }
}

在我的测试中,我创建的文件与您的二进制格式匹配。由于您没有显示下一条记录开始的位置,您可能会发现需要额外阅读,例如使用ReadByte,但这取决于您的实际结构。