如何解决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
阅读全文