【问题标题】:efficient and flexible binary data parsing高效灵活的二进制数据解析
【发布时间】:2009-08-31 19:28:48
【问题描述】:

我有一个外部设备可以输出二进制数据的 UDP 数据包,而嵌入式系统上运行的软件需要读取此数据流,对其进行解析并做一些有用的事情。二进制数据也被记录到文件中。我想编写一个解析器,可以轻松地直接从 UDP 流或文件中获取输入,将数据解析为特定格式,然后将输出定向到文件(例如 matlab dat 文件)或另一个进程这将进行一些实时处理。是否有任何资源可以帮助我解决这个问题,最好的方法是什么?我认为使用 C++ 流可能有意义,但我不熟悉创建自定义输出流。这似乎是一种好方法,还是有更好的方法?

谢谢。

【问题讨论】:

    标签: parsing udp stream binary-data io


    【解决方案1】:

    二进制数据的美妙之处在于它通常具有非常固定的格式。 解析它的典型方法是声明一个映射到接收到的数据包的结构,然后仅使用类型转换将字段读取为结构元素。

    美妙之处在于这不需要解析。

    您必须小心结构打包规则和字节序,以使结构映射完全相同。使用 C 的“offsetof”和“sizeof”宏有助于发出一些调试信息,以检查您的结构确实映射到您认为的映射。

    打包规则通常可以通过指令(例如#pragma's)或命令行选项进行更改。你坚持使用字节序。如果它与您的嵌入式系统使用的不同,请将所有字段声明为字节,或使用“ntoh”宏之类的东西来进行字节交换。

    【讨论】:

    • 感谢您的回复。我一直在研究使用磁带转换来做解析部分,我喜欢这样。我还剩下实际的输入/输出...我想实时从 UDP 数据包中获取数据,或者从记录的数据文件中获取数据,然后将解析后的数据写入另一个文件,或者制作其他类或进程可以访问它。
    【解决方案2】:

    The New Jersey Machine Code Toolkit 是一种用于解码任意二进制模式的方案。它最初是为解码指令集而设计的,但它应该可以很好地用于解码消息格式。您提供二进制格式的描述,它合成代码以访问该格式的字段(有效时)。因此,您可以使用生成的函数调用来引用消息字段,而不必考虑字段的位置或编码方式。

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多