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

UPD。最好有一个快速的库,用于从内存中顺序读取位、字、对齐、未对齐等。我可以自己编写声明式前端甚至 DSL。

4

1 回答 1

7

有来自 AT&T 好人的PADS 。还有可以用于同样事情的RAGEL 。我自己也没有使用过,但在此页面上发现了它们存在的提示。

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

祝你好运!

于 2013-05-21T04:56:02.523 回答