在 C# 中将 .ddd(数字行驶记录仪)文件读取/解析为 XML
Posted
技术标签:
【中文标题】在 C# 中将 .ddd(数字行驶记录仪)文件读取/解析为 XML【英文标题】:Reading/Parsing a .ddd (digital tachograph) file to XML in C# 【发布时间】:2015-09-13 00:36:38 【问题描述】:顺便说一下,我对 C# 还很陌生,需要将 .ddd
(digital tachograph 输出文件扩展名)转换为 .xml
。
作为第一步,我应该阅读该文件,因此我正在查看示例。我发现的每个信息来源都使用基于.txt
的示例来读取文件。在我的示例中,文件类型.ddd
远非如此。
我正在考虑二进制读取,但也不确定。正确的方法是什么?
【问题讨论】:
如果文件不包含文本,您需要指定其格式,并且您应该使用 FileStream 和最有可能的 BinaryReader 来读取它。您可能需要联系 Siemens 以获取文件格式规范的副本,假设您可以拥有一份。文件格式可能是专有的并且未公开记录,在这种情况下,您需要谷歌搜索能够读取此类文件的其他软件解决方案。 请在此处添加一个.ddd
示例文件引用给我们尝试通过C# 阅读。
文件格式似乎记录在这里:readesm.sourceforge.net/help.html#legislation,确实不应该被视为文本文件。
很遗憾,我可能无法分享这些内容。它们包括有关车辆和驾驶员驾驶时间以及车辆属于运输公司的数据。我在网上找了一些例子,但也没有机会。
另外,ReadESM 是一个开源软件,用于读取行驶记录仪数据。 Sourceforge 网站上提供了源代码,但我没有使用 C++ 的经验,所以源代码对我来说是另一个谜。 sourceforge.net/p/readesm/code/HEAD/tree
【参考方案1】:
答案很晚,但这个库是用 C# 编写的,并且支持数字行驶记录仪规范的大部分内容。
https://github.com/jugglingcats/tachograph-reader
该库提供了两个类,可以读取驱动程序和车辆卡二进制文件并写入 XmlWriter。 XML 结构良好,为后续处理提供了二进制文件内容的清晰表示。请注意,代码不会检查文件中的数字签名。
来自自述文件:
使用非常简单。有一个主类 DataFileReader 和两个子类:VehicleUnitDataFile 和 DriverCardDataFile。您可以使用以下方法创建其中一个子类的实例:
DataFile vudf=VehicleUnitDataFile.Create();
DataFile dcdf=DriverCardDataFile.Create();
一旦你有了一个阅读器实例,你就可以给它一个二进制文件来读取和一个 XML 写入器:
vudf.Process("file.ddd", writer);
两种数据文件格式的大部分部分/功能都得到满足。可以使用 DriverCardData.config 和 VehicleUnitData.config 修改数据文件格式。这是两个 XML 文件,定义了具有特定于标准的特性(例如循环缓冲区支持)的数据结构。
【讨论】:
我已经下载了这个,似乎无法读取任何DDD文件。我没有收到错误,但内容保持为空。【参考方案2】:要执行转换,您需要知道:
如何从文件中读取二进制数据 文件可以包含的确切内容(每个字节) Xml 中所需的输出从文件中读取二进制数据相当简单——BinaryReader
具有各种访问数据的方法,特别是如果数据可以在单个前向传递中处理(似乎就是这种情况)。那里有大量 BinaryReader
示例。
更重要的是了解数据的含义。带有值0x20
的单个字节可能意味着:
32
该字节可能是 UInt16
的第一个字节,具有完全不同的值
"下一个数据块是 32 字节长"
"第一个数据块可以在偏移 32 处找到"
“下一个数据块是元数据”(这个字节表示某种块类型)
墙上有 32 瓶啤酒
如果不了解每个位置的每个字节的含义,您将一事无成。
然后有了这些信息,并将文件读入一些合适的类,转换为 Xml 就像将类传递给 XmlSerializer
一样简单。
【讨论】:
【参考方案3】:还有现成的解决方案,例如 ReadESM (https://sourceforge.net/projects/readesm/files/) 或 DDD2XML (https://www.canlab.cz/en/DDD2XML)。 DDD2XML 还支持第二代行驶记录仪。
【讨论】:
以上是关于在 C# 中将 .ddd(数字行驶记录仪)文件读取/解析为 XML的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中将 100 000 条记录插入 MDB 文件的最快方法是啥