【发布时间】:2014-05-06 18:40:46
【问题描述】:
这个问题看起来很简单也很可行,但我这辈子都做不到。
我有:
- 我知道一个带有几个数据包的 PCAP 文件是某种类型的 ProtoBuf 数据(可能使用 protobuf-csharp-port 创建)
-
程序集中所有可能的 C# 类都装饰有:
[DebuggerNonUserCode, CompilerGenerated, GeneratedCode("ProtoGen", "2.4.1.473")] public sealed class thing : GeneratedMessageLite<thing, thing.Builder>
我要做的就是使用我从程序集文件中知道的内容来解析这些数据包。简单的?可能,但无论我做什么,实际上都没有被解析。
这是许多可能的类之一的示例:
[DebuggerNonUserCode, CompilerGenerated, GeneratedCode("ProtoGen", "2.4.1.473")]
public sealed class Thing: GeneratedMessageLite<Thing, Thing.Builder>
{
// Fields
private static readonly string[] _thingFieldNames = new string[] { "list" };
private static readonly uint[] _thingFieldTags = new uint[] { 10 };
...
public static Builder CreateBuilder()
{
return new Builder();
}
...
public static thing ParseFrom(ByteString data)
{
return CreateBuilder().MergeFrom(data).BuildParsed();
}
...
public override void WriteTo(ICodedOutputStream output)
{
int serializedSize = this.SerializedSize;
string[] strArray = _thingFieldNames;
if (this.list_.Count > 0)
{
output.WriteMessageArray<thingData>(1, strArray[0], this.list_);
}
}
...
[DebuggerNonUserCode, GeneratedCode("ProtoGen", "2.4.1.473"), CompilerGenerated]
public static class Types
{
// Nested Types
[CompilerGenerated, GeneratedCode("ProtoGen", "2.4.1.473")]
public enum PacketID
{
ID = 19
}
}
}
类似的还有很多。我试过对每个数据包做这样的事情(使用 protobuf-csharp-port):
Console.WriteLine(Thing.ParseFrom(packet.Buffer).ToString());
我希望看到实际的文本数据。但我要么什么也没得到,一个关于无效数据包标签的错误,或者一个关于它是“0”的错误。
我也尝试过使用 protobuf-net,但它只是给了我关于不兼容、意外类型等的随机错误:
Console.WriteLine(ProtoBuf.Serializer.Deserialize<Thing>(ms));
我到底做错了什么?有没有更好的方法,使用程序集中的所有已知类型,简单地解码 Protobuf 消息并查看里面有什么?理想情况下不必事先知道它是什么类型的消息?
如果你能解决这个问题,非常感谢!
【问题讨论】:
标签: c# protocol-buffers