首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试理解protoBuf二进制流

尝试理解protoBuf二进制流
EN

Stack Overflow用户
提问于 2017-05-02 20:53:34
回答 1查看 215关注 0票数 1

编辑:以反映@jpa的响应。

我正在访问一个通过UDP使用带有以太网屏蔽的Arduino生成数据的服务器。数据以protobuf的形式存在,我有.proto文件,但是实现纳米粒对我来说是一个挑战。同时,我尝试使用这个参考文献手动解码二进制流--这对我来说可能更容易。

我仍然不确定如何解码(在HEX中)。例如,为什么数据包2-9充斥FF?我相信这就是int64时间戳所在的地方。我还注意到,数据包12-15也可以容纳FF,我认为这是因为这里是存放浮点数的地方。

默认情况下,ProtoBufData是数据类型: int64、float、bool。但是能够流ExtProtoBufData: int64、float、bool、float、float (扩展)。

.proto文件:

代码语言:javascript
复制
package ProtoBufData;

message ExtendedProtoBufSensorData {
   optional float Angle1 = 4 [default = 0];
   optional float Angle2 = 5 [default = 0];
}
message ProtoBufSensorData {
   required int64 Timestamp = 1 [default = 0];
   optional float SensorValue = 2 [default = 0];
   optional bool State = 3 [default = false];
   // the following represent sub-types; at most 1 should have a value
   optional ExtendedProtoBufSensorData ExtendedProtoBufSensorData = 100;
}

下面是输出(ProtoBufData)。我注意到,在大多数情况下,我收到了17个“字节”,但有时我收到了15个字节。如果有人能帮助解码,我将非常感激:

代码语言:javascript
复制
PACKET 1: 8
PACKET 2: FFFFFFB3
PACKET 3: FFFFFFE7
PACKET 4: FFFFFFAB
PACKET 5: FFFFFFA9
PACKET 6: FFFFFF97
PACKET 7: FFFFFFAF
PACKET 8: FFFFFFA4
PACKET 9: FFFFFFEA
PACKET 10: 8
PACKET 11: 15
PACKET 12: 2B
PACKET 13: 28
PACKET 14: 3
PACKET 15: 42
PACKET 16: 18
PACKET 17: 1

这是ExtendedProtoBufData的输出。大部分时间,我得到30个“字节”,但有时我得到28个。

代码语言:javascript
复制
PACKET 1: FFFFFFA2
PACKET 2: 6
PACKET 3: A
PACKET 4: 25
PACKET 5: FFFFFFCF
PACKET 6: FFFFFF8C
PACKET 7: 24
PACKET 8: 3E
PACKET 9: 2D
PACKET 10: FFFFFFC9
PACKET 11: FFFFFFDE
PACKET 12: FFFFFF97
PACKET 13: 3F
PACKET 14: 8
PACKET 15: FFFFFFDE
PACKET 16: FFFFFFA5
PACKET 17: FFFFFFC7
PACKET 18: FFFFFF9E
PACKET 19: FFFFFFA3
PACKET 20: FFFFFFC1
PACKET 21: FFFFFFA4
PACKET 22: FFFFFFEA
PACKET 23: 8
PACKET 24: 15
PACKET 25: FFFFFF81
PACKET 26: 36
PACKET 27: 12
PACKET 28: 3D
PACKET 29: 42
PACKET 30: 1

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2017-05-04 11:38:00

打印字节的方式有问题。部分原因似乎是您无意中将unsigned值转换为signed,这会导致0xB3被打印为0xFFFFFFB3

这是你的包裹,里面的混乱已经解决了:

代码语言:javascript
复制
0x08 0xB3 0xE7 0xAB 0xA9 0x97 0xAF 0xA4
0xEA 0x08 0x15 0x2B 0x28 0x03 0x42 0x18
0x01

现在我们可以手动解码它了:

代码语言:javascript
复制
0x08  Tag 1, varint
0xB3 0xE7 0xAB 0xA9 0x97 0xAF 0xA4 0xEA   Varint field value

0x08 Tag 1, varint

0x15 0x2B 0x28 0x03 0x42 0x18 0x01 .. didn't bother this far ..

这没什么意义。我假设在您的打印中还存在一些缺陷,所以首先要集中精力使它可靠地工作。

也许尝试检查调试器或网络记录器中的消息数据,以验证您的打印功能是否正确地打印了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43747044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档