协议缓冲区发送数据包 Header C#

Protocol buffer sending Packet with Header C#

你好,我有一个关于 Proto 缓冲区的问题,我从在线游戏中嗅探数据包,它使用 Proto 缓冲区,所以我尝试了很多次通过 proto 缓冲区再次发送这个数据包,但我不能它没有给出任何动作,我让控制台应用程序得到结果,我发现结果我不完整,因为有长度和数据包编号并且 header 没有出现在结果中我可以发送数据包所以有办法发送 header 和带有原始缓冲区的数据包 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

我想发送数据包,就像我用 header 和偏移量 2 中的数据包 ID 嗅探的数据包>> 1A 27 有办法吗? 谢谢

这里的前缀显然不是fixed-32;它可能是 varint(base-128),所以第一个改变就是使用它。

现在,您提到了数据包编号和长度。如果这些不是合适的 protobuf 格式,那么简单:您可能需要手动编写 header。我知道 解码 public API 上的原始 varint,但我不记得是否有 编码的代码 一个 - 但是:它最终并不是很复杂。所以:最坏的情况,自己写前几个字节。

最后:永远不要使用 GetBuffer(),除非您要捕获 Length 并对其进行限制。它 returns 一个 超大 缓冲区。