在C#中将.ddd(数字行车记录仪)文件读取/解析为XML
本文关键字:读取 文件 XML 记录仪 ddd 中将 数字 | 更新日期: 2023-09-27 17:59:45
顺便说一句,我对C#还很陌生,需要将.ddd
(数字行车记录仪输出文件扩展名)转换为.xml
。
作为第一步,我应该阅读该文件,所以我正在查看示例。我发现的每一个信息来源都在使用基于.txt
的文件读取示例。我的示例中的文件类型.ddd
与此相去甚远。
我在考虑二进制读取,但也不确定。正确的方法是什么?
答案很晚,但这个库在C#中,支持数字行车记录仪规范的大多数部分。
https://github.com/jugglingcats/tachograph-reader
该库提供了两个类,它们可以读取驾驶员和车辆卡二进制文件并写入XmlWriter。XML结构良好,为后续处理提供了二进制文件内容的清晰表示。请注意,该代码不会检查文件中的数字签名。
来自自述文件:
用法很简单。有一个主类DataFileReader和两个子类:VehicleUnitDataFile和DriverCardDataFile。您可以使用以下方法创建其中一个子层的实例:
DataFile vudf=VehicleUnitDataFile.Create();
DataFile dcdf=DriverCardDataFile.Create();
一旦你有了一个阅读器实例,你就可以给它一个要读取的二进制文件和一个XMLWriter:
vudf.Process("file.ddd", writer);
这两种数据文件格式的大部分部分/功能都得到了满足。可以使用DriverCardData.config和VehicleUnitData.config修改数据文件格式。这两个XML文件定义了具有特定于标准的功能(如循环缓冲区支持)的数据结构。
要执行转换,您需要知道:
- 如何从文件中读取二进制数据
- 文件可以包含的确切内容(每一个字节)
- Xml中所需的输出
从文件中读取二进制数据相当简单——BinaryReader
有各种方法来访问数据,尤其是如果数据可以在一次前向传递中处理(似乎就是这样)。有很多BinaryReader
的例子。
更重要的是了解数据的含义。值为0x20
的单个字节可能表示:
- SPACE字符
- 值
32
- 该字节可以是具有完全不同值的
UInt16
的第一个字节 - "下一个数据块长32字节"
- "第一个数据块可以在偏移32处找到"
- "下一个数据块是元数据"(此字节表示某种块类型)
- 墙上有32瓶啤酒
如果没有关于每个位置的每个字节的含义的信息,你就不会有任何进展。
然后,有了这些信息,并将文件读取到一些合适的类中,到Xml的转换就可以像将类传递给XmlSerializer
一样简单。
还有现成的解决方案,如ReadESM(https://sourceforge.net/projects/readesm/files/)或DDD2XML(https://www.canlab.cz/en/DDD2XML)。DDD2XML还支持第二代行车记录仪。