C# BinaryReader - данные, которые могут быть или не быть в двоичном файле

Я использую двоичный файл для хранения измеренных данных какого-либо продукта. Раньше этот продукт был единственным, теперь я должен сохранять / загружать больше типов продуктов.

Я собираюсь сохранить некоторый дескриптор типа в начале файла, 1 байта должно быть абсолютно достаточно, будет только несколько типов (2, возможно, 3 или 4 в будущем).

Проблема в том, что мне все еще нужно иметь возможность загружать старые двоичные файлы без этого дескриптора. Вот мой старый код с комментариями, где я хочу проверить наличие дескриптора, а затем принять решение о типе продукта, например:

  1. Нет дескриптора -> старый продукт
  2. Descriptor = 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();
     }

1 ответ

Решение

Проблема, если я правильно понимаю, заключается в том, что вы не знаете, читаете ли вы дескриптор типа (новый файл) или первое значение данных (старый файл).

Один из простых способов решить эту проблему - выбрать другое расширение для новых файлов, но в зависимости от вашей ситуации это может быть не вариант.

Если нет, вы можете добавить к описателю продукта магическое значение, которое никогда (или маловероятно) не появляется в старом формате файла. Что-то простое, как символы ASCII "TYP" за которым следует байт дескриптора продукта, вряд ли будет отображаться в старом формате файла (который начинается с double значение).

Вы даже можете выбрать сериализацию double.MinValue как ваша магическая ценность, как DateTime.FromOADate могу только читать

значение между отрицательным 657435,0 и положительным 2958465,999999999

Это полностью исключило бы ложную идентификацию старого файла как нового.

Другие вопросы по тегам