[英]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文件解析为数组,以便可以使用适当的名称(例如,
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.