protobuf流中的意外数据

时间:2017-07-21 20:31:47

标签: javascript protocol-buffers

我目前正在开展一个小型项目尝试用JavaScript解码协议缓冲流,我发现一些非常奇怪的数据与编码规范不匹配({{3 }})。

我无法访问.proto文件,因此我无法仔细检查并查看字段的外观,因此我只是编码编码规范并希望它能正常工作。 / p>

以下是一个似乎正确编码的对象示例(请注意,二进制数据已转换为十进制数,并且出于安全原因,两个字符串中的所有字符都已更改为' x'字符):

8 6 18 15 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 26 3 88 88 88

根据规范,这应该通过以下方式解析:

8 - field number 1, wire type 0
6 - first and last byte of varint, value 6
18 - field number 2, wire type 2
15 - string length of 15 characters
88 - x (times 15)
26 - field number 3, wire type 2
3 - string length of 3 characters
88 - x (times 3)

所以这最终会解析为以下数据:

field 1: 6
field 2: xxxxxxxxxxxxxxx
field 3: xxx

现在这是一个没有正确解析的对象:

8 56 58 18 12 88 88 88 88 88 88 88 88 88 88 88 88 26 7 88 88 88 88 88 88 88

通过我的解析器运行,我得到以下内容:

8 - field number 1, wire type 0
56 - first and last byte of varint, value 56
58 - field number 7, wire type 2
18 - string length of 18 characters
at this point the next 18 characters are parsed as "byte" data, which is clearly not correct

我的问题/混淆是在第二条消息的前4个字节周围:

8 56 58 18

看起来似乎有一个2字节的varint,56和58,但56的高位显然没有设置,所以在尝试解析varint时它会在那里结束。

有谁知道为什么这个额外的字节似乎正在悄悄进入,以及我应该如何应对它? protobuf编码规范似乎并没有表明任何看起来相似的东西。

更新

我还没有设法解决这个问题,但我发现我可以通过protoc命令运行相同的二进制数据,该命令吐出一个有效的对象,因此它显然是有效的。当我有机会看到他们是如何做的时候,我可能会调查他们的代码

0 个答案:

没有答案