C# BinaryReader - 数据可能在也可能不在二进制文件中
C# BinaryReader - data which may or may not be in binary file
我正在使用二进制文件来存储某些产品的测量数据。以前只有一种产品,现在我要save/load种产品。
我打算在文件的开头保存一些类型描述符,1个字节应该是绝对足够的,类型只有几个(2个,将来可能是3个或4个)。
问题是,我仍然需要能够在没有这个描述符的情况下加载旧的二进制文件。这是我的带有注释的旧代码,我想在其中检查描述符的存在,然后像这样对产品类型做出决定:
- 无描述符 -> 旧产品
- 描述符 = xxx -> 新产品 xxx
是否可以用这种格式保存描述符?我想调用 reader.PeekChar()
只是一种可能性,因为不会移动到下一个字节,但我不确定在这种情况下如何使用它。
BinaryReader reader;
using (reader = new BinaryReader(File.Open(header.path, FileMode.Open, FileAccess.Read)))
{
// ...
// check presence of product type descriptor
// make a decision of type
// ...
DateTime measTime = DateTime.FromOADate(reader.ReadDouble());
double diameter = reader.ReadDouble();
double plusToler = reader.ReadDouble();
double minusToler = reader.ReadDouble();
}
如果我理解正确的话,问题是你不知道你是在读取类型描述符(新文件)还是第一个数据值(旧文件)。
解决此问题的一个简单方法是为新文件选择不同的文件扩展名 - 但根据您的情况,这可能不是一个选项。
如果不是,您可以在产品描述符前添加一个从不(或不可能)出现在旧文件格式中的神奇值。像 ASCII 字符 "TYP"
后跟产品描述符字节这样简单的东西不太可能出现在旧文件格式中(以 double
值开头)。
您甚至可以选择将 double.MinValue
序列化为您的魔法值,因为 DateTime.FromOADate
只能读取
a value between negative 657435.0 through positive 2958465.99999999
这将完全排除错误地将旧文件识别为新文件的可能性。
我正在使用二进制文件来存储某些产品的测量数据。以前只有一种产品,现在我要save/load种产品。
我打算在文件的开头保存一些类型描述符,1个字节应该是绝对足够的,类型只有几个(2个,将来可能是3个或4个)。
问题是,我仍然需要能够在没有这个描述符的情况下加载旧的二进制文件。这是我的带有注释的旧代码,我想在其中检查描述符的存在,然后像这样对产品类型做出决定:
- 无描述符 -> 旧产品
- 描述符 = xxx -> 新产品 xxx
是否可以用这种格式保存描述符?我想调用 reader.PeekChar()
只是一种可能性,因为不会移动到下一个字节,但我不确定在这种情况下如何使用它。
BinaryReader reader;
using (reader = new BinaryReader(File.Open(header.path, FileMode.Open, FileAccess.Read)))
{
// ...
// check presence of product type descriptor
// make a decision of type
// ...
DateTime measTime = DateTime.FromOADate(reader.ReadDouble());
double diameter = reader.ReadDouble();
double plusToler = reader.ReadDouble();
double minusToler = reader.ReadDouble();
}
如果我理解正确的话,问题是你不知道你是在读取类型描述符(新文件)还是第一个数据值(旧文件)。
解决此问题的一个简单方法是为新文件选择不同的文件扩展名 - 但根据您的情况,这可能不是一个选项。
如果不是,您可以在产品描述符前添加一个从不(或不可能)出现在旧文件格式中的神奇值。像 ASCII 字符 "TYP"
后跟产品描述符字节这样简单的东西不太可能出现在旧文件格式中(以 double
值开头)。
您甚至可以选择将 double.MinValue
序列化为您的魔法值,因为 DateTime.FromOADate
只能读取
a value between negative 657435.0 through positive 2958465.99999999
这将完全排除错误地将旧文件识别为新文件的可能性。