Алгоритм создания экземпляров класса для конкретной задачи
Бьюсь уже несколько дней с алгоритмом создания экземпляров класса для следующей задачи вводная: Есть файл в котором последовательно записаны данные. Перед началом блока данных в файле есть заголовок(Begin) и после части с данными есть конечная часть(End). также есть блок с флагами, который может быть между Begin и End, а может быть и снаружи этой структуры. Но опытным путём выяснил, что если блок с флагами относится к конкретной структуре, то Offset этого блока с флагами всегда равняется на 0x150 байт больше чем offset структуры к которой он относится. Самая большая проблема для меня оказалась в том, что по какой-то причине перед блоком с данными может быть несколько заголовков Begin и несколько заголовков End c разными данными в них. Корректные данные в заголовке считаются из первого Begin и до последнего End. Написал парсер который возвращает все расшифрованные заголовки в листе.
примерно такого содержания list
public class Data
{
public long offsetBlock { set; get; }
public string flag { set; get; }
....
public string BeginEnd{ set; get; }
{
Такого вот содержания: + описание алгоритма словами
Offset: 2C End игнорируем этот экземпляр.
Offset: 242 End игнорируем этот экземпляр.
Offset: 394 Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset
Offset: 12E6 Begin игнорируем
Offset: 633A Begin игнорируем
Offset: A892 Begin игнорируем
Offset: AB1E Flag помещаем в поле flagOffset класса Section
Offset: B250 End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: B2A2 Flag игнорируем
Offset: B2F2 Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset
Offset: B344 End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: B396 Flag игнорируем
Offset: B3E6 Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset
Offset: B438 End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: B48A Flag игнорируем
Offset: B4DA Flag здесь до блока Begin 0x150 байт. Значит его нужно будет поместить в блок Section
Offset: B62A Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset + добавить данные о флаге
Offset: D87C Begin игнорируем
Offset: F9E2 End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: FA34 Flag игнорируем
Offset: FA84 Flag игнорируем
Offset: FAD4 Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset
Offset: FB26 End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: FB78 Flag игнорируем
Offset: FBC8 Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset
Offset: FC1A End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: FC6C Flag игнорируем
Offset: FCBC Begin нужно создать экземпляр класса Section и поместить в поле begin значение offset
Offset: FD0E End помещаем в поле end класса Section. Экземпляр готов, помещаем экземпляр в лист.
Offset: FD60 Flag
Offset: FDB0 Begin
Offset: FE02 End
Offset: FE54 Flag
Offset: FEA4 Begin
Offset: FEF6 End
Offset: FF48 Flag
Offset: FF98 Begin
Offset: FFEA End
Offset: 1003C Begin
Offset: 1008E End
Offset: 100E0 Begin
Offset: 10132 End
Offset: 10184 Begin
Offset: 101D6 Begin
Offset: 10228 End
Offset: 1027A Begin
Offset: 102CC End
Offset: 1031E Begin
Offset: 10370 End
Offset: 103C2 Flag
Offset: 10412 Flag
Offset: 10462 Begin
Offset: 104B4 End
Offset: 10506 Flag
Offset: 10556 Flag
Offset: 105A6 Flag
Offset: 105F6 Begin
Offset: 10648 End
Offset - от начала файла из которого этот экземпляр создавался.
Мне нужно из этих данных получить реальные значения offset начала и конца блока с данными. для тестов создал класс
public class Section
{
public long begin { set; get; } = -1;
public long end { set; get; } = -1;
public long flagOffset { set; get; } = -1;
}
хочу в него помещать значения начала и конца блока данных. По сути задача сводиться к созданию экземпляров класса Section c данными begin и End. Пока не получается придумать алгоритм по которому будут корректно создаваться экземпляры класса Section. У меня получаются либо begin = -1, либо end = -1 и тд.
Ответы (1 шт):
Не совсем понятно что нужно в вопросе, но рази интереса потыкал палкой в файлик, получился такой код
var fname = @"C:\Dev\Temp\11.txt";
using (var reader = new StreamReader(File.OpenRead(fname))){
while (!reader.EndOfStream)
{
string begin = null, offset = null, end = null;
while(!reader.EndOfStream){
var line = reader.ReadLine();
if (line.Contains("Begin")){
begin = line;
break;
}
}
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line.Contains("Flag"))
offset = line;
if (line.Contains("End"))
{
end = line;
break;
}
}
if (end != null){
var section = new Section() {
begin = Convert.ToInt64(begin.Split(' ')[1], 16),
flagOffset = offset != null ? Convert.ToInt64(offset.Split(' ')[1], 16) : -1,
end = Convert.ToInt64(end.Split(' ')[1], 16)
};
Console.WriteLine($"{section.begin} {section.flagOffset} {section.end}");
}
}
}
На выходе выдает следующее
916 43806 45648
45810 -1 45892
46054 -1 46136
46298 -1 63970
64212 -1 64294
64456 -1 64538
64700 -1 64782
64944 -1 65026
65188 -1 65270
65432 -1 65514
65596 -1 65678
65760 -1 65842
65924 -1 66088
66170 -1 66252
66334 -1 66416
66658 -1 66740
67062 -1 67144