繁体   English   中英

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

[英]Parsing a binary file with multiple data types into an array

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

Fokker DR 1 
Germany 
D 
A 
1000.0 
13

二进制文件的内容如下: dat文件文字

我正在尝试将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]);
    }
}

有没有什么方法可以在不同数据类型的每个实例处进行拆分,或者还有另一种方法来标记我的二进制文件中的数据?

BinaryFormatter将不处理该文件格式。 鉴于其体积小巧和简单明了的规格,一些超自然的读取逻辑应该可以解决问题。

如果使用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但这取决于您的实际结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM