gpt4 book ai didi

c# - 我如何使用 PrefixStyle 和 ProtoBuf-net 获取长度数?

转载 作者:太空狗 更新时间:2023-10-30 01:26:25 25 4
gpt4 key购买 nike

在下面的示例中,我如何使用 PrefixStyle 和 ProtoBuf-net 获取长度数?

PrefixStyle.Base128 和 PrefixStyle.Fixed32 有什么区别?

谢谢!

            PerfTest clone;
using (MemoryStream ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix(ms, obj,PrefixStyle.Base128);
byte[] raw = ms.ToArray();
ms.Position = 0;
clone = Serializer.DeserializeWithLengthPrefix<PerfTest>(ms,PrefixStyle.Base128);

}

编辑:使用字节数组下面的代码长度为22。为什么TryReadLengthPrefix 返回21?肯定是应该返回 22 吗?

           PerfTest clone;
using (MemoryStream ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix(ms, obj,PrefixStyle.Base128);
byte[] raw = ms.ToArray();
ms.Position = 0;

int bArrayLen = ms.ToArray().Length; //returns 22

int len;// set to 21. Why not 22?
Serializer.TryReadLengthPrefix(ms, PrefixStyle.Base128,out len);

clone = Serializer.DeserializeWithLengthPrefix<PerfTest>(ms,PrefixStyle.Fixed32);

}

最佳答案

Fixed32 始终使用 4 个字节作为长度前缀 - 这对于手动打包消息的人来说似乎并不少见(事实上,由于重复请求,我什至不得不在某些时候添加不同的字节序版本)。

虽然首选应该是 Base128,它使用“varint”编码,因此小数字占用更少的编码空间。此外,此前缀样式可用于使一系列对象与具有 repeated 字段的单个对象有线兼容,这有一些有用的应用。

重新获取长度;如果您正在使用 DeserializeWithLenghPrefixDeserializeItems 您不需要 - 它会在内部处理。但如果您需要这个,请查看 Serializer.TryReadLengthPrefix

澄清一下:*WithLengthPrefix 方法的目的是允许在单个流中分离不同的对象/消息 - 最常见的是:网络套接字。这是必要的,因为协议(protocol)本身假定整个流是单个消息,因此会继续尝试读取直到流/套接字关闭。

关于 22 和 21 字节;那是因为长度前缀本身需要一些长度:)实际上如果数组是 22 我有点惊讶有效载荷不是 20 - 我字节字段为首(使组合流本身成为有效的 protobuf 流),1 字节长度和 20 字节的有效载荷。我现在在手机上,所以无法运行样本进行调查;可以省略字段头(可选),但是 - 因此它可以是 1 字节长度,21 字节有效负载。我稍后再看。

关于c# - 我如何使用 PrefixStyle 和 ProtoBuf-net 获取长度数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4977777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com