在 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 文件的最快方法是啥

在 C# 中将上标转换为 Unicode [关闭]

如何在 C# 中将 SVG 文件转换为 EMF 文件

在 C# 中将 SQL Datareader 转换为数据集

.NET C# - 文本文件中的随机访问 - 没有简单的方法?

在python中将字符串转换为数字[关闭]