协议定义语言

时间:2010-01-21 22:25:27

标签: protocols

您推荐什么协议定义? 我评估了Google的协议缓冲区,但它不允许我控制正在构建的数据包中的字段位置。我认为Thrift也是如此。我的要求是:

  1. 指定数据包中字段的位置
  2. 允许位字段
  3. 条件:标志(位字段)= true表示数据可以出现在数据包的稍后位置
  4. 通过引用另一个数据包定义来定义数据包结构的能力
  5. 谢谢。

    (SourceForge上的“Flavor”,用于定义MPEG-4可能是一个候选者,但我正在寻找一些似乎有更多社区的东西,最好在.NET环境中工作。)< / p>

3 个答案:

答案 0 :(得分:5)

了解ASN.1 http://es.wikipedia.org/wiki/ASN.1

FooProtocol DEFINITIONS :: = BEGIN

FooQuestion ::= SEQUENCE {
    trackingNumber INTEGER,
    question       IA5String
}

FooAnswer ::= SEQUENCE {
    questionNumber INTEGER,
    answer         BOOLEAN
}

END

它似乎涵盖了您的主要要求:

- Bit detail
- ordered content
- type references
- not sure, about conditions

被广泛使用,你可以在java和python上找到一些实现

答案 1 :(得分:3)

我对你的要求的原因感兴趣。为什么需要控制字段的位置?为什么位域很重要?条件语句?

听起来你有一个(或多或少)固定的有线格式,你需要为它编写一个解析器,在这种情况下,没有现有的流行协议/序列化格式(Protobufs,Thrift,JSON,Yaml等) 。)将为你工作。

一种有点不正统的方法是使用ErlangHaskell,这两种方法都对parsing binary protocols有很好的支持。

答案 2 :(得分:0)

C#本身怎么样?

例如

class MySimplePDLData {
  // format: name (or blank if padding), bit length, value (or blank if data),
  // name of presence flag field (or blank if no presence flag), C# type
  // one packet type per string, fields separated by pipes (|)
  string[] pdl = {

// MY-SIMPLE-PDL-START

  ",8,0xf8,|version,8,,Int32|type,8,,Int32|id1,64,,Int64",
  ...

// MY-SIMPLE-PDL-END

  };
}

如果数据已在内存中,则无需在文件格式上执行IO。从这里开始,您可以动态解释包或为包识别/打包/解包生成必要的C#源代码,再次使用C#本身。