C#二进制阅读器-数据可能在二进制文件中,也可能不在

本文关键字:二进制文件 也可能 二进制 数据 | 更新日期: 2023-09-27 18:29:34

我使用二进制文件来存储某些产品的测量数据。该产品以前是唯一的一种类型,现在我必须能够保存/加载更多类型的产品。

我将在文件的开头保存一些类型描述符,1个字节应该足够了,只有几个类型(2个,将来可能是3个或4个)。

问题是,我仍然需要能够在没有这个描述符的情况下加载旧的二进制文件。这是我的旧代码和注释,我想检查描述符的存在,然后对产品类型做出这样的决定:

  1. 无描述符->旧产品
  2. 描述符=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();
     }

C#二进制阅读器-数据可能在二进制文件中,也可能不在

如果我理解正确性,问题是您不知道是在读取类型描述符(新文件)还是第一个数据值(旧文件)。

解决这个问题的一个简单方法是为新文件选择不同的文件扩展名,但根据您的情况,这可能不是一个选项。

如果没有,您可以在产品描述符前面加一个神奇的值,这个值永远不会(或不太可能)出现在旧的文件格式中。像ASCII字符"TYP"后面跟着产品描述符字节这样简单的东西不太可能出现在旧的文件格式中(以double值开头)。

您甚至可以选择将double.MinValue序列化为您的魔术值,因为DateTime.FromOADate只能读取

负657435.0到正2958465.99999999 之间的值

这将完全排除错误地将旧文件识别为新文件的可能性。