c - C的二进制流解析库

标签 c parsing

<分区>

你能推荐一个经过验证的 C 二进制流解析库吗?如果它像 C 语言所允许的那样具有声明性,那就太好了。

我需要它来解析二进制协议(protocol)并通过它的正式规范来描述相当复杂的协议(protocol),这就是为什么我希望它尽可能多地声明。就像是 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。

最佳答案

PADS来自 AT&T 的好人。还有 RAGEL可以用于同一件事。我自己都没有用过,但在 this page 上发现了它们存在的迹象| .

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

祝你好运!

关于c - C的二进制流解析库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16662096/

相关文章:

python - 在 NLTK 解析器中使用整数/日期作为终端

python - 解析文本文件python并转换为pandas dataframe

c - 发送方缓冲区中未确认数据的 TCP 表示

c - 从数组列表中删除重复项

c - 为什么 gets() 不起作用?

c - 使用#define 来索引数组?

android - HttpClient 返回错误的 csv?

parsing - 如何修复来自后增量运算符的 YACC 移位/减少冲突?

c# - Apple "FairPlay Key Security Module"必须用 C 实现吗?

ios - 从 Foursquare URL 加载图像到 UIImageView