协议定义语言

10
我建议使用什么协议定义? 我评估了Google的协议缓冲区,但它不允许我控制正在构建的数据包中字段的位置。我认为Thrift也是如此。我的要求是:
  1. 指定数据包中字段的位置
  2. 允许位域
  3. 条件:标志(位域)= true表示数据可以出现在数据包的后面位置
  4. 能够通过引用另一个数据包定义来定义数据包结构
谢谢。
(“Flavor”在SourceForge上,用于定义MPEG-4可能是一个候选项,但我正在寻找更具社区性和最好在.NET环境中运行的东西。)
3个回答

6
请查看ASN.1技术相关内容:http://es.wikipedia.org/wiki/ASN.1 FooProtocol DEFINITIONS ::= BEGIN
FooQuestion ::= SEQUENCE {
    trackingNumber INTEGER,
    question       IA5String
}

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

看起来它似乎涵盖了你的主要需求:

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

该技术被广泛使用,您可以在Java和Python中找到一些实现。


2
只是为了明确,ASN.1并没有定义协议,而只是数据的布局。如果您真的想指定协议,您需要指示可能的有效消息交换序列。如果协议是“简单”的话,可以使用FSAs来实现;如果不是,则考虑使用彩色佩特里网。 - Ira Baxter

3

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

听起来您有一个(更或少)固定的线路格式,您需要为之编写解析器,在这种情况下,现有的流行协议/序列化格式(Protobufs、Thrift、JSON、Yaml等)都无法满足您的需求。

一个有些不正统的方法是使用 ErlangHaskell,两者都具有对解析二进制协议的良好支持。


我需要控制字段的位置,因为我们使用的协议定义要求如此。位域很重要,因为协议定义了这一点。条件语句是必要的,因为一个字段集可能要求创建另一个字段。我会查看您关于Erlang和Haskell的建议。 - Mr. T.

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#本身。

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