0

所以我有两个文件:一个 mot 文件和一个 xml 文件。我需要对这些文件做的是从 xml 文件中读取数据并将其与 mot 文件(如果存在)进行比较。这是一般的想法。

首先,对于那些不熟悉什么是 mot 文件的人(我也没有太多的知识,只是基础知识)......
(来自维基百科)一个 mot 文件(或摩托罗拉 S-Record 文件)是一种以 ASCII 十六进制文本形式传送二进制信息的文件格式。
(来自另一个来源)一个 S 记录文件由一系列特殊格式的 ASCII 字符串组成。S-record 的长度将小于或等于 78 个字节。

S-Record 的格式为:
S | 类型 | 记录长度 | 地址(起始地址) | 数据 | 校验和
(例如 S21404200047524D5354524D0000801410AA5AA555F9)
([解析] S2 14 042000 47524D5354524D0000801410AA5AA555 F9)

具体的想法是我在地址0x042000~0x04200F中分配了数据AA BB CC DD等。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 文件进行比较?有人可以指导我如何完成这项工作或提供如何正确开始的指南。

如果我对任何事情不清楚,请告诉我。

编辑:

我想到了一个主意。不过,我不确定这是否可行。假设程序将读取 mot S-Record 文件,它会识别记录的类型。从那里,文件中列出的每个记录行都将被分解,如下面的示例所示:

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 文件中定位它。

告诉我这是否可行,或者是否有其他选择。

4

1 回答 1

0

当我错的时候纠正我,因为它充满了假设:

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");
         }
     }
}

让我知道它是否对您有所帮助

于 2015-05-13T09:25:55.293 回答