如何解决pbjs在编码时无法处理bytes类型数据的问题?
摘要:一段包含 bytes 类型的 protobuf 二进制数据,经过 pbjs 解码生成的 json 文件,再传递给 pbjs 编码后生成的二进制数据和原始数据差异巨大,经过一番探究,发现居然是 pbjs 的一个 bug,快来看看你是否踩过这个
问题背景
之前写过一篇《使用脚本收发 protobuf 协议数据 》,通过 pbjs 命令可以将 protobuf 二进制数据转换为 json:
> pbjs msg.proto --decode ProbeIpv6Response < response.bin
{
"selfAddr": {
"addrV6": "2409:8900:7900:8f0d:ecd9:4aee:aa3:7ad",
"portV6": 46066
},
"brosAddr": [
{
"addrV6": "2409:8a34:4405:6624:5250:9d04:cf77:d",
"portV6": 18720
},
{
"addrV6": "2409:8a34:401a:4151:59e6:69b4:37ad:dea2",
"portV6": 18679
},
{
"addrV6": "2409:8a20:2a02:20c0:7d11:9a6b:6b51:a9bb",
"portV6": 18824
},
{
"addrV6": "2409:8a20:e0d:7773:50d4:93b0:680a:b555",
"portV6": 18968
},
{
"addrV6": "2409:8a44:5b20:edf2:7c09:a5e1:cdbf:69c6",
"portV6": 18008
}
]
}
反过来将 json 编码为二进制数据也没问题:
> pbjs msg.proto --encode ProbeIpv6Response < response.json > response2.bin
> xxd response2.bin
00000000: 122b 0a25 3234 3039 3a38 3930 303a 3739 .+.%2409:8900:79
00000010: 3030 3a38 6630 643a 6563 6439 3a34 6165 00:8f0d:ecd9:4ae
00000020: 653a 6161 333a 3761 6410 f2e7 021a 2a0a e:aa3:7ad.....*.
00000030: 2432 3430 393a 3861 3334 3a34 3430 353a $2409:8a34:4405:
00000040: 3636 3234 3a35 3235 303a 3964 3034 3a63 6624:5250:9d04:c
00000050: 6637 373a 6410 a092 011a 2d0a 2732 3430 f77:d.....-.'240
00000060: 393a 3861 3334 3a34 3031 613a 3431 3531 9:8a34:401a:4151
00000070: 3a35 3965 363a 3639 6234 3a33 3761 643a :59e6:69b4:37ad:
00000080: 6465 6132 10f7 9101 1a2d 0a27 3234 3039 dea2.....-.'2409
00000090: 3a38 6132 303a 3261 3032 3a32 3063 303a :8a20:2a02:20c0:
000000a0: 3764 3131 3a39 6136 623a 3662 3531 3a61 7d11:9a6b:6b51:a
000000b0: 3962 6210 8893 011a 2c0a 2632 3430 393a 9bb.....,.&2409:
000000c0: 3861 3230 3a65 3064 3a37 3737 333a 3530 8a20:e0d:7773:50
000000d0: 6434 3a39 3362 303a 3638 3061 3a62 3535 d4:93b0:680a:b55
000000e0: 3510 9894 011a 2d0a 2732 3430 393a 3861 5.....-.'2409:8a
000000f0: 3434 3a35 6232 303a 6564 6632 3a37 6330 44:5b20:edf2:7c0
00000100: 393a 6135 6531 3a63 6462 663a 3639 6336
