C# BinaryReader - данные, которые могут быть или не быть в двоичном файле
Я использую двоичный файл для хранения измеренных данных какого-либо продукта. Раньше этот продукт был единственным, теперь я должен сохранять / загружать больше типов продуктов.
Я собираюсь сохранить некоторый дескриптор типа в начале файла, 1 байта должно быть абсолютно достаточно, будет только несколько типов (2, возможно, 3 или 4 в будущем).
Проблема в том, что мне все еще нужно иметь возможность загружать старые двоичные файлы без этого дескриптора. Вот мой старый код с комментариями, где я хочу проверить наличие дескриптора, а затем принять решение о типе продукта, например:
- Нет дескриптора -> старый продукт
- 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
Это полностью исключило бы ложную идентификацию старого файла как нового.