您推荐什么协议定义? 我评估了Google的协议缓冲区,但它不允许我控制正在构建的数据包中的字段位置。我认为Thrift也是如此。我的要求是:
谢谢。
(SourceForge上的“Flavor”,用于定义MPEG-4可能是一个候选者,但我正在寻找一些似乎有更多社区的东西,最好在.NET环境中工作。)< / p>
答案 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等) 。)将为你工作。
一种有点不正统的方法是使用Erlang或Haskell,这两种方法都对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#本身。