C语言的二进制流解析库

3

请问有没有C语言可靠的二进制流解析库推荐?如果能够像C语言声明式那样就更好了。

我需要用它来解析二进制协议,并通过协议的正式规范描述相当复杂的协议,因此希望它尽可能地声明式。类似于Haskell的Data.Binary.Get就很不错。

我找到了binpac,但它似乎很重量级,而且是面向C ++的,但该项目是纯C的。

以下是我所说的示例:

parser_t parsers[] = {
  { get_bit,      out_field1, &pkt.field1 }
 ,{ get_bit7,     0,           0          } // skip 7 bits
 ,{ get_word16be, out_field2, &pkt.field2 }
 ,{ 0,            0,           0          } // end
};

// skip
// char *data, char *data_end, 
map_parsers(data, data_end, parsers); // parse stream

更新:仅拥有一个快速的库以从内存中顺序读取位、字、对齐、不对齐等内容是可以的。我可能会自己编写声明性前端甚至DSL。


C语言没有流构造,也许如果您提供一些示例数据以及获取数据的方式,例如FIFO、命名管道等,那么我们可以为您指出一个工具或库。 - Grady Player
char*已经足够好了。例如: - voidlizard
在问题中添加了示例 - voidlizard
@Grady - "流"是一个通用词,不论语言或库支持如何,其重点通常在于避免关注源数据是文件、网络连接或其他什么,而是专注于数据的结构。 - user180247
1个回答

7

有来自AT&T的友好人员开发的PADS,还有RAGEL也可以用于同样的事情。我自己都没有使用过,但在这个页面上找到了它们存在的线索。

PADS看起来与Objective Systems和Google Protocol buffers的ASN1编译器的想法相似;您编写模式文件,然后将其编译为所选源代码语言。当然,两者都适用于严格定义的二进制编码方案,而PADS似乎适用于任意数据流。

祝你好运!


当我需要解析文本数据时,我使用Ragel,但对于这样的任务来说并不是很方便。我会尝试使用PADS,谢谢。 - voidlizard
1
我使用过Ragel,并且大多数情况下我都喜欢它。它似乎更适用于处理文本文件而不是二进制文件,但是当然,8位字符和8位字节之间没有太大的区别。一个问题是,它主要是基于正则语法。有一些技巧可以明确地将信息推送到堆栈中等等,但理论上至少有可能超出其功能(例如需要一个上下文无关文法)。但在实践中,我怀疑这种情况在二进制文件中是否真的会发生-在文本文件中,这意味着您使用Ragel进行标记化,并在顶部添加解析器。 - user180247
嗨,我注意到PADs链接不再有效。有人有可用的副本或知道它现在被托管在哪里吗? - casillic
@casillic,我觉得我在https://github.com/yitzhakm/PADS-ML找到了它。里面有一个tgz文件,里面包含了PADS C编译器。 - bazza
@casillic,我刚刚成功从http://www.padsproj.org/下载了PADS/C。用户名和密码在他们的许可协议底部给出,并提供了我的电子邮件和姓名以从主页进入下载站点。 - bazza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接