代码之家  ›  专栏  ›  技术社区  ›  Mr. T.

协议定义语言

  •  7
  • Mr. T.  · 技术社区  · 15 年前

    你推荐什么协议定义? 我评估了谷歌的协议缓冲区,但它不允许我控制正在构建的包中字段的位置。我想节俭也是如此。我的要求是:

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

    谢谢您。

    (“ Flavor “在用于定义mpeg-4的sourceforge上,可能是一个候选者,但我正在寻找一种更具社区特色、更适合在.NET环境中工作的东西。”

    3 回复  |  直到 11 年前
        1
  •  3
  •   JesperE    15 年前

    我对你提出要求的原因感兴趣。为什么需要控制字段的位置?为什么位域很重要?Conditionals?

    听起来您有一种(或多或少)固定的有线格式,您需要为其编写解析器,在这种情况下,现有的流行协议/序列化格式(Protobufs、Thrift、JSON、Yaml等)都不适合您。

    有点非正统的做法是使用 Erlang Haskell ,两者都有很好的支持 parsing binary protocols .

        2
  •  5
  •   Clark Ku    13 年前

    看看ASN.1 http://es.wikipedia.org/wiki/ASN.1

    FOOProtocol定义::=开始

    FooQuestion ::= SEQUENCE {
        trackingNumber INTEGER,
        question       IA5String
    }
    
    FooAnswer ::= SEQUENCE {
        questionNumber INTEGER,
        answer         BOOLEAN
    }
    

    结束

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

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

    被广泛使用,您可以在Java和Python上找到一些实现方式。

        3
  •  0
  •   martinr    15 年前

    怎么样 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本身。