【问题标题】:C# BinaryReader - data which may or may not be in binary fileC# BinaryReader - 可能在也可能不在二进制文件中的数据
【发布时间】:2016-01-08 12:53:39
【问题描述】:

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

我打算在文件的开头保存一些类型描述符,1 Byte 应该是绝对够用的,只会有几种类型(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();
     }

【问题讨论】:

  • 您的源流是一个普通文件,因此是可搜索的,对吧?如果是这样,(暂时)“移动到下一个字节”有什么问题?
  • 哦,你是对的。我没有想到临时寻求。
  • 我会在旧产品上使用虚拟描述符,并在检测到虚拟值时将其丢弃。这比在文件中来回遍历要高效得多。两种方法都可以
  • @nicomp:但问题是,我还需要能够加载没有描述符的旧文件。求解决了这个问题。效率没那么损失,我肯定用了4个字节,所以我读了4个字节然后往回找,就这样。

标签: c# binaryfiles descriptor binaryreader


【解决方案1】:

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

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

如果没有,您可以在产品描述符前加上一个在旧文件格式中从不(或不太可能)出现的魔法值。像 "TYP" 后跟产品描述符字节这样简单的 ASCII 字符不太可能出现在旧文件格式中(以 double 值开头)。

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

介于负值 657435.0 到正值 2958465.99999999 之间的值

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

【讨论】:

  • 是的,我最终得到了您建议的第二个解决方案。我以与您提到的类似的格式保存char[4] 序列,因为该序列不能出现在旧数据中。然后使用reader.ReadChars(4),解析答案,最后reader.Seek(-4, SeekOrigin.Current),以防找不到描述符,
猜你喜欢
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多