所以我有两个文件:mot文件和xml文件。我需要对这些文件执行的操作是从xml文件中读取数据并将其与mot文件(如果存在)进行比较。这是一般的想法。
在其他任何事情之前,对于那些不熟悉什么的人 文件是(我也不太了解它,只是基础知识)...
(From Wikipedia)一个mot文件(或摩托罗拉S-Record file)是一种以ASCII Hex文本形式传送二进制信息的文件格式 (from another source) S记录文件由a组成 特殊格式的ASCII字符串序列。 S记录 将小于或等于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#的熟悉程度要低得多,尽管我对两者都有一点点经验。我最初认为它会是这样的:
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文件中找到它。
告诉我这是否有效,或者是否有其他选择。
答案 0 :(得分: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");
}
}
}
让我知道它是否有点帮助你