Получение данных из xml-файла и сравнение их с текстовым файлом

Итак, у меня есть два файла: файл mot и файл xml. Что мне нужно сделать с этими файлами, так это прочитать данные из файла xml и сравнить их с файлом mot, если он существует. Это общая идея.

Прежде всего, для тех, кто не знаком с тем, что такое mot-файл (у меня тоже нет особых знаний об этом, только основы)...
(Из Википедии) Файл mot (или файл Motorola S-Record) представляет собой формат файла, который передает двоичную информацию в текстовой форме ASCII Hex. .
(из другого источника) S-запись файл состоит из последовательности специально отформатированных строк символов ASCII. Длина S-записи будет меньше или равна 78 байтам.

Формат S-Record:
S | Тип | Длина записи | Адрес (начальный адрес) | Данные | Контрольная сумма
(например, S21404200047524D5354524D0000801410AA5AA555F9)
([разобрано] S2 14 042000 47524D5354524D0000801410AA5AA555 F9)

Конкретная идея в том, что у меня данные AA BB CC DD и т. д. размещены по адресам 0x042000 ~ 0x04200F. То, что написано в xml, будет:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record>
  <File name="Test.mot">
    <Address id="042000">
    <Data>AA</Data>
  </Address>
  </File>
</record>
<record>
  <File name="Test.mot">
    <Address id="042001">
      <Data>BB CC DD</Data>
    </Address>
  </File>
</record>
<record>
  <File name="Test.mot">
    <Address id="042004">
      <Data>EE FF</Data>
    </Address>
  </File>
</record>

Затем программа получала данные и адрес из XML и искала в файле .mot любые совпадения. Итак, если в mot-файле есть запись S214042000AABBCCDDEEFF01234567891A2B3C4D5EF9, то это должно привести к совпадению с тем, что есть в xml. Результат — true или 1. Если что-то в xml не соответствует, то возвращается false или 0.

Теперь проблема будет заключаться в том, что я плохо разбираюсь в C#, а тем более в XML, хотя у меня был небольшой опыт работы с обоими. Я изначально думал, что это будет что-то вроде этого:

using (StreamReader sr = new StreamReader("Test.mot"))
{
     String line =String.Empty;
     while ((line = sr.ReadLine()) != null)
     {
         if (line.Contains("042004") & line.Contains("EE FF"))
         {
             Console.WriteLine("Success");
         }
         else
         {
             Console.WriteLine("Failure");
         }
     }
}

Но, очевидно, это не привело к тому, что я ожидал. И Failure продолжает появляться. Имею ли я право использовать StreamReader для чтения файла .mot? А что касается файла XML, XMLDocument будет работать? Как получить данные из xml и сравнить их с файлом .mot? Может ли кто-нибудь рассказать мне, как это сделать, или предоставить руководства, как правильно начать с этого.

Дайте мне знать, если мне что-то непонятно.

РЕДАКТИРОВАТЬ:

Я придумал идею. Хотя я не уверен, что это выполнимо. Допустим, программа прочитает файл S-Record mot и определит тип записи. Оттуда каждая строка записи, указанная в файле, будет разбита, как показано в примере ниже:

sample record line: "S214042000AABBCCDDEEFF01234567891A2B3C4D5EF9"  
S2 - type w/c means there would be a 3-byte address  
14 - record length  
F9 - checksum  
042000 - AA  
042001 - BB  
042002 - CC  
042003 - DD  
...  
04200F - 5E  

Я думаю или надеюсь, что с этим новым списком программе будет проще использовать данные в XML, чтобы найти их в mot-файле.

Скажите, будет ли это работать, или есть ли какие-либо альтернативы.


person Kurisuchin    schedule 13.05.2015    source источник
comment
Привет, кажется, вы используете побитовый операнд (&) в своем состоянии. Вы пробовали использовать логический операнд (&&)? если (строка.Содержит(042004) && строка.Содержит(EE FF))   -  person    schedule 13.05.2015
comment
Я эксперт как в формате Motorola (40 лет), так и в XML. Мой первый вопрос: каково количество байтов данных? Мой первый способ — создать массив byte[] и поместить в него один формат. Затем сравните второй формат с byte[]. Я не уверен, что делать с неиспользуемыми ячейками памяти в массивах. Похоже, у вас формат Morotorola S2 (не S3 или S4), что означает, что у вас небольшое устройство менее 64 КБ. Формат S2 не может быть отсортирован по возрастанию ячеек памяти.   -  person jdweng    schedule 13.05.2015
comment
@jdweng количество байтов будет зависеть от s-типа. образец, который я показал, был только с s2, но у меня также есть форматы s1 и s3, которые я могу использовать.   -  person Kurisuchin    schedule 13.05.2015
comment
Обычно я делаю 2 прохода по данным. Во-первых, получить диапазон адресов. Затем я создаю массив byte[] размером с диапазон адресов со всеми значениями, установленными на ноль (иногда FF). Затем заполните массив из одного формата. Затем я либо сравниваю 2-й формат с первым на лету, либо создаю 2-й байт [] и заполняю 2-й формат, сравнивая 2 байта []. Не уверен в этом случае, какой метод является лучшим с предоставленной информацией.   -  person jdweng    schedule 13.05.2015
comment
Я не уверен, понял ли я это, но вы имеете в виду, что в программе программа каким-то образом вычисляла бы диапазон адресов только с извлеченным адресом (например, 042000) из xml? Таким образом, если соответствующие данные для этого адреса - AA BB, который имеет два байта, тогда диапазон адресов будет 042000 042001. Что вы подразумеваете под заполнением массива из одного формата? Извините, если я не сразу понял ваши объяснения. Не могли бы вы предоставить образец процесса? И, пожалуйста, дайте мне знать, если я не предоставил какую-либо другую важную информацию. Спасибо   -  person Kurisuchin    schedule 14.05.2015
comment
@jdweng Я немного отредактировал пост, добавил еще немного информации. Может прояснить некоторую путаницу.   -  person Kurisuchin    schedule 15.05.2015


Ответы (1)


Поправьте меня, если я ошибаюсь, так как он полон предположений:

XML дает только начальные значения пакета данных в файле mot:

          ||||||||||||
S214042000AABBCCDDEEFF01234567891A2B3C4D5EF9
          AABBCCDDEEFF

Вы можете прочитать xml и поместить каждую запись в класс записи.

public class Record
{
    string FileName{get;set;}
    string Id {get;set;}
    string Data {get;set;}
    public Record(){} //default constructor
}

с классом XmlDocument вы можете прочитать xml.

что-то типа:

var document = new XmlDocument();
document.LoadXml("your.xml");

var records = document.SelectNodes("record");
var recordList = new List<Record>();
foreach(var r in records)
{
    var file = r.SelectSingleNode("file");
    var fileName = file.Attributes["name"].Value;
    var address = file.SelectSingleNode("Address");
    var id = address.Attributes["id"].Value;
    var data = address.SelectSingleNode("Data").InnerText.Replace(" ", "");

    recordList.Add(new Record{FileName = fileName, Id = id, Data = data});
}

После этого вы можете прочитать каждую строку файла mot по положению: поскольку местоположение 042000 всегда должно быть 5-10 символом.

var fn = "Test.mot";
using (StreamReader sr = new StreamReader(fn))
{    
     var record = recordList.Single(r=> r.FileName);
     String line =String.Empty;
     while ((line = sr.ReadLine()) != null)
     {        

         if (line.SubString(4,6) == record.Id && line.SubString(10, record.Data.Length) == record.Data)
         {
             Console.WriteLine("Success");
         }
         else
         {
             Console.WriteLine("Failure");
         }
     }
}

Дайте мне знать, если это помогло вам немного

person Schuere    schedule 13.05.2015
comment
Schuere: Вы правы в том, что оба формата дают только начальный адрес и байты данных, количество которых может варьироваться. Количество байтов в двух форматах (XML и Mot S) может не совпадать с размерами заблокированных записей. И диапазон памяти может быть огромным. Использование класса Record может быть хорошей идеей, но сейчас я не могу сказать, имея ограниченную информацию. В прошлом я писал код с использованием записей, но убедился, что записи начинаются с границы, кратной 2, и заполняют неиспользуемое место фиксированными данными. - person jdweng; 13.05.2015
comment
@Schuere, привет, я думаю, это сработает, если формат записи будет исправлен. и, как сказал jdweng, форматы не могут быть одинаковыми во всех случаях. плюс меня беспокоит то, что если в строке есть дубликат записи, которую я пытаюсь найти (например, в одной строке записи есть два 2A) - person Kurisuchin; 14.05.2015