【问题标题】:Binary streams parsing library for C [closed]C的二进制流解析库[关闭]
【发布时间】:2013-05-21 04:20:26
【问题描述】:

您能否推荐一个经过验证的 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。

【问题讨论】:

  • C 没有流结构,也许如果你给我们一些示例数据,以及你从哪里得到它,即 FIFO、命名管道等,那么我们可以为你指出一个工具或库.
  • char* 已经足够好了。示例:
  • 向问题添加示例
  • @Grady - “流”是一个常用词,与语言或库支持无关,重点通常是避免源是文件、网络连接或其他什么的问题,并专注于数据的结构。

标签: c parsing


【解决方案1】:

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

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

祝你好运!

【讨论】:

  • 我在需要解析文本数据的时候使用Ragel,但是对于这样的任务来说不是很方便。我会尝试使用 PADS,谢谢。
  • 我用过 Ragel,我最喜欢它。它似乎更适合处理文本文件而不是二进制文件,但当然,8 位字符和 8 位字节之间没有太大区别。一件事-它主要是基于常规语法的。有一些技巧可以显式推送信息。到堆栈等,但至少在理论上有可能超越它的能力(例如,需要上下文无关的语法)。但在实践中,我怀疑二进制文件中是否会发生这种情况——在文本文件中,这只是意味着您使用 Ragel 作为标记器并在顶部有一个解析器。
  • 您好,我注意到 PAD 链接不再处于活动状态。有没有人可以提供或知道它现在托管在哪里?
  • @casillic,我想我在github.com/yitzhakm/PADS-ML 找到了它。有一个 tgz,里面有 PADS C 编译器。
  • @casillic,我刚刚从padsproj.org 成功下载了PADS/C。用户名和密码在他们的许可协议底部给出,并交出我的电子邮件和姓名,以便从他们的主页访问下载站点。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多