【问题标题】:Binary Decoder with xml specified data structure具有xml指定数据结构的二进制解码器
【发布时间】:2013-02-28 16:42:38
【问题描述】:

我想构建 C# 二进制解码器。我有描述二进制文件数据结构的 XML 文件。

下一步是基于该 XML 动态创建数据结构(在代码中)。 你们有什么cmet、链接、代码等给我吗?

我知道这是一个普遍的问题,但我只是想从哪里开始,我不知道从哪里开始。

编辑:

抱歉需要删除代码...

BR

【问题讨论】:

  • 您有两个问题。一个有点过于宽泛(如何解码二进制信息),另一个是如何读取 XML 文件。您应该将问题一分为二,并为每个特定问题提供更多信息。
  • 是的,我知道这一点。问题是这个问题是相关的。我需要编写基于 XML 构建 C# 结构或类的代码。读取 XML 不是问题,有很多简单的方法可以做到这一点,但诀窍是如何从该 XML 生成结构或类(在代码中)。
  • 不,它们并不真正相关。您可以阅读 XML 并创建 C# 类,其中包含有关如何构建对象的说明。 XML 部分只是指令的序列化,并不是生成问题的真正部分。您还需要提供 XML 包含的内容吗?类名/属性名?还是您应该使用它来尝试找出数据类型的数据?
  • 这是最后一个。我的 xml 文件包含描述数据类型的数据(字节、ushort(这里我有小端序问题)等)。所以我的 xml 文件说:这是标题,这是 1 号事件,这是可选参数等。请查看我的问题(抱歉重复问题):stackoverflow.com/questions/15020696/…

标签: c# xml binaryfiles


【解决方案1】:

由于您想要动态创建结构(而不​​是基于 XML 定义静态构建类),我猜您需要一个通用数据结构,然后您可以查询该结构。这到底是什么样子取决于您描述的数据结构类型。是记录和字段吗?层次结构中是否有多种记录类型?如果没有层次结构,您可以只为每个字段使用键值对字典。如果存在层次结构,我会认为可导航树将涵盖大多数场景。您可以为此使用 XML DOM,但我认为这不是最简洁的解决方案,我更喜欢使用通用树结构。没有内置的(请参阅Tree data structure in C#),但使用泛型创建一个相当容易。

编辑

以上假设您想要动态创建一个结构以动态使用。 如果您想在代码中动态创建一个结构,将使用静态(例如,您希望能够编写类似myDataStrucureThatWasDefinedInXml.MyProperty1 的东西),请查看 CodeDom。

在考虑了更多之后,这实际上取决于您在反序列化二进制数据后想要做什么。您可能还想查看 Expando 对象和表达式树。

【讨论】:

  • 嗨,这是一个非常有趣的答案。关键问题是我有这个 xml 文件,它描述了如何解码和解析数据(例如:first come header,其中包含 9 个参数,这两个参数是可选的,等等)并且这个 XML 将改变 未来。编辑:还有一个 xsd 文件,它是我的 xml 文件的描述(但 xml 和二进制文件是应用程序的输入)。
  • 如果 XML 要更改,我认为您对数据所做的操作是相当通用的,并且不依赖于那里的某些数据?否则,每次 XML 更改时,都需要更改处理反序列化数据的代码。如果是这样,听起来您需要通用数据结构方法。
  • 我从您添加的示例代码中看到您正在尝试直接读取结构(我没有意识到这是在内存中)。由于您没有精确的结构,因为它是在 XML 中定义的,因此您必须读取二进制数据,而不是作为结构,而只是作为字节数组。然后,根据您的 XML 定义,您必须解释该数组(并将其放入通用结构或动态对象等中)。
  • 嗨,这是不安全的代码,因为结构不安全。这只是我的第一个例子。因此,应用程序的输入是:二进制文件(多个文件)、描述数据类型、结构等的 XML 文件(xml 文件在某种程度上是机密的 :( )并且可选地我有这个文件的 xsd 作为输入(如果它以某种方式有用的话)
  • 您可以使用 Stream.Read,传入要读取的字节数(在您的 XML 文件中定义)和一个字节数组来放入数据。然后您可以从中取出数据字节数组(在您的 XML 文件中进一步定义)并将其放入通用数据结构中。
【解决方案2】:

要读取和写入 XML 文档的内容,您可以使用 C# 中提供的XmlDocument 类。

这里有一些链接,可以帮助你:

【讨论】:

  • 此处不允许仅链接答案。你应该提取一个代码 sn-p 来显示任务是如何执行的。
  • 您好,谢谢回答,但读取 XML 完全没有问题。问题是如何从代码中的 xml 生成结构或类。
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2017-09-15
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
相关资源
最近更新 更多