你好我有一个关于Proto缓冲区的问题我从网上游戏嗅探它使用Proto缓冲区的数据包所以我尝试了很多时间再次通过proto缓冲区发送这个数据包但是我不能让我做任何动作我制作控制台应用程序得到结果,我发现结果我没有完成,因为有长度和数据包号码和标题没有出现在结果我可以发送数据包所以有方法发送标题和数据包ID与原型缓冲区而不改变它们
这里是我的代码:
[ProtoContract]
public class Person
{
//[ProtoMember(0)]
//public string Name { get; set; }
public ushort Length;
public uint PacketNumer;
[ProtoMember(1, IsRequired = true)]
public uint UID;
[ProtoMember(2, IsRequired = true)]
public uint X;
[ProtoMember(3, IsRequired = true)]
public uint Y;
[ProtoMember(4, IsRequired = true)]
public uint TimeStamp;
[ProtoMember(5, IsRequired = true)]
public uint JumpStyle;
[ProtoMember(6, IsRequired = true)]
public uint Direction;
[ProtoMember(7, IsRequired = true)]
public uint FromX;
[ProtoMember(8, IsRequired = true)]
public uint FromY;
[ProtoMember(9, IsRequired = true)]
public uint MapID;
}
static void Main(string[] args)
{
Person input = new Person
{
UID = 12786811,
X = 430,
Y = 405,
TimeStamp = (uint)Environment.TickCount,
JumpStyle = 137,
Direction = 1,
FromX = 427,
FromY = 410,
MapID = 1002
};
var stream = new MemoryStream();
Serializer.SerializeWithLengthPrefix(stream, input, PrefixStyle.Fixed32);
Console.WriteLine(BitConverter.ToString(stream.GetBuffer()));
Person result;
//object output;
result = Serializer.DeserializeWithLengthPrefix<Person>(stream, PrefixStyle.Base128);
Console.ReadLine();
}
我从游戏中嗅探的数据包:
2F 00 1A 27 08 FB B8 8C 06 38 BC 03 40 FC 02 48 9B C4 BF 40 60 89 01 68 07 70 BB 03 78 FA 02 88 01 CF 0F A0 01 FF FF FF FF FF FF FF FF FF 01
以下是App的结果:
1E-00-00-00-08-FB-B8-8C-06-10-AE-03-18-95-03-20-A0-AB-B3-41-28-89-01-30-01-38-AB-03-40-9A-03-48-CF-0F
我希望发送数据包完全类似于数据包i我在偏移2&gt;&gt;中使用标头和数据包ID进行嗅探1A 27 有没有办法呢? 感谢
答案 0 :(得分:0)
这里的前缀显然不固定-32;它可能是varint(base-128),所以第一个改变就是使用它。
现在,您提到了数据包编号和长度。如果它们不是合适的protobuf格式,那么简单地说:您可能需要手动编写标题。我知道在公共API上有解码原始varint的代码,但我不记得是否有编码的代码 - 但是:它最终不是很复杂。所以:最糟糕的情况是,自己写下前几个字节。
最后:永远不要使用GetBuffer(),除非你捕获长度并限制它。它返回超大缓冲区。