高效灵活的二进制数据解析

时间:2009-08-31 19:28:48

标签: parsing udp stream binary-data io

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

美丽的是,这不需要解析。

你必须要小心结构打包规则,并使用endian-ness来使结构映射完全相同。使用C“offsetof”和“sizeof”宏可以发出一些调试信息,以检查您的结构是否确实映射到您认为映射的内容。

包装规则通常可以通过指令(例如#pragma's)或命令行选项进行更改。 Endian-ness你被困住了。如果它与嵌入式系统使用的不同,则将所有字段声明为字节,或使用类似“ntoh”宏的字节进行字节交换。

答案 1 :(得分:0)

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