c# запись и чтение в бинарный файл

Было дано задание:

Данные должны храниться в бинарном файле следующего формата: [Сигнатура][Запись с id 1][Запись с id 2]…[Запись с id N]

Сигнатура файла – первые 8 букв ваших фамилии, имени и отчества на латинице. Сигнатура файла – первые 8 букв ваших фамилии, имени и отчества на латинице.

Запись должна содержать:

Флаг удаления (1 байт): 0 для существующих записей и 1 для удаленных

Тип записи (1 байт): номер варианта вашей записи

Данные ваших записей (длина – максимальный размер из ваших вариантов записей)

Данные формируются из полей вашей записи:

Поле типа int – 4 байта

Поле типа string – фиксированный размер строки с завершающим нулем (например, 100 байт

Поле типа bool – 1 байт

Как правильно установить фиксированный размер на запись строки? Например как в задании. Допустим я захочу записать строку которая будет занимать 20 символов, то как ограничить фиксированный размер строки в 100 байт? Заполнять пробелами пока не будет заполнено все 100 байт? Можно ли это сделать как то другим способом? Не очень понимаю как это реализовать.

А так же как например реализовать поиск по бинарному файлу. Допусти мне нужно найти строку c id 20. Просто идти в лоб? Запустить цикл и перебирать подходящий id? Если так,то какой цикл использовать? foreach в таком случаем не подойдет ибо он будет итерировать только по 1 символу. Помогите пожалуйста разобраться как правильно реализовать это задание

моя запись файла на данный момент выглядит так:

public TravelRouteV13 Save(TravelRouteV13 records) {
  var parsedDate1 = DateTime.Parse(records.data_1);
  var parsedDate2 = DateTime.Parse(records.data_2);
  BinaryWriter writer = new BinaryWriter(File.Open(pathFromData, FileMode.Append));
    record.Add(records);
    writer.Write($"[id:{records.id},address:{records.address},activity:{records.activity},data:{parsedDate2.Subtract(parsedDate1)},delete:{0}],");
    writer.Close();
    return records;
}

Ответы (1 шт):

Автор решения: aepot

берем строчку, например

string text = "Hello world";

Преобразуем ее в массив байт используя кодировку например UTF-8

byte[] bytes = Encoding.UTF8.GetBytes(text);

Делаем длину массива 100 байт

if (bytes.Length != 100)
    Array.Resize(ref bytes, 100);

Как записать массив байт с помощью BinaryWriter вы уже знаете.

Потом обратно

int eol = Array.IndexOf(bytes, 0);
if (eol > 0)
    Array.Resize(ref bytes, eol);
string result = Encoding.UTF8.GetString(bytes);

Русские буквы кодируются 2 байтами, поэтому 100 байт != 100 символов.

→ Ссылка