gpt4 book ai didi

c# - 为什么我无法使用 protobuf-net 从二进制数据中读取 VarInt 字段

转载 作者:行者123 更新时间:2023-12-04 06:04:16 46 4
gpt4 key购买 nike

每个人,

我正在使用 protobuf-net 库将文本数据序列化-反序列化为二进制文件。我过去有过类似的错误,但后来我犯了将二进制数据写入文本文件的错误。这次我确定文件是以二进制模式写入的。当我读取数据时,我得到 EndOfStream 异常:尝试读取流的末尾。

我在二进制文件中的每个对象之前都有一个消息头。

message HeaderMessage {
required double timestamp = 1;
required string ric_code = 2;
required int32 count = 3;
required int32 total_message_size = 4;
}

当我在固定位置读取 total_message_size 字段时出现异常
HEADER: 1111    1       1       hk      0
File: 398909440 bytes
Reading data objects:
1073561: 09 e3 a5 9b c4 0c b3 e0 40 12 07 31 30 39 33 2e 48 4b 18 04 20 5a
1073677: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 32 39 37 2e 48 4b 18 02 20 2d
1073748: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 32 39 37 2e 48 4b 18 04 20 5a
1073864: 09 e3 a5 9b c4 0c b3 e0 40 12 07 38 31 37 33 2e 48 4b 18 02 20 2d
1073935: 09 e3 a5 9b c4 0c b3 e0 40 12 07 38 31 37 33 2e 48 4b 18 04 20 5b
1074052: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 32 33 35 2e 48 4b 18 02 20 2d
1074123: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 36 30 33 2e 48 4b 18 02 20 2d
1074194: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 36 30 33 2e 48 4b 18 04 20 5b
1074311: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 32 33 35 2e 48 4b 18 06 20 8a

在上面的输出中,第一个字段是流位置。总流长度为 398909440。因此流不可能到达终点。我试图在无法读取时打印单个字段,我看到 ProtoReader 类总是无法读取 total_message_size 字段。

在 aboe 输出中,最后一行是 protobuf-net 无法读取数据的罪魁祸首。
1074311: 09 e3 a5 9b c4 0c b3 e0 40 12 07 30 32 33 35 2e 48 4b 18 06 20 8a

如果我们拆分字段,数据如下所示:
field1 timestamp field: type: 09  payload: e3 a5 9b c4 0c b3 e0 40
field2 ric_code field: type: 12 payload: 07 30 32 33 35 2e 48 4b
field3 count field: type: 18 payload: 06
field4 total_message_size: type: 20 payload: 8a

读取第 4 个字段的有效负载时引发异常,值为 8a。 (十进制 138)。

堆栈跟踪如下:
   at ProtoBuf.ProtoReader.TryReadUInt32VariantWithoutMoving(Boolean trimNegative, UInt32& value) in C:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:line 101
at ProtoBuf.ProtoReader.ReadUInt32Variant(Boolean trimNegative) in C:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:line 138
at ProtoBuf.ProtoReader.ReadInt32() in C:\Dev\protobuf-net\protobuf-net\ProtoReader.cs:line 264
at protobuf_test.Program.Main(String[] args) in H:\Personal\Visual Studio 2010\Projects\protobuf-test\protobuf-test\Program.cs:line 80
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

读取值 138 有什么问题?在这种情况下有什么问题?

问候,
阿洛克

最佳答案

0x8a 是 不是 一个有效的变量。 Varint 编码使用 MSB 作为继续位,意思是:如果设置了 MSB,则至少还有一个预期的字节(它继续直到 MSB 设置为 不是 设置,将剩余的 7 位块小-endian 风格)。因此,0x8a 不能 本身存在于有效的 varint 中。 0x8a 和其他东西 , 当然。您可以在 wire spec 中看到这一点.请确保您没有不小心剪掉这条单独消息的结尾,或者误报了长度(因为我收集到每条记录都是用大小前缀单独包装的)。

关于c# - 为什么我无法使用 protobuf-net 从二进制数据中读取 VarInt 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8559566/

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