这个 Protobuffer 解码有什么问题?

3
我正在使用Google Protobuffer解码一些缓冲区。我使用了优秀的@decodeIO ProtoBuf.js模块。
当我尝试解码这个缓冲区时:
<Buffer 0a 0b 47 57 5f 2d 31 38 5f 39 39 32 39>

从这个消息中:

message PaymentResponseElement {
  optional int64  pnPaymentId       = 1;
  optional string messageCode       = 2; //won't use pb enum here
  optional int64  balanceAfterTransaction   = 3;
  optional int32  version           = 4;
}

我得到了这个错误:
Error: Illegal wire type for field Message.Field .core.comm.PaymentResponseElement.messageCode: 2 (0 expected)
    at ProtoBuf.Reflect.Field.decode (/home/joojo/node_modules/protobufjs/ProtoBuf.js:2095:27)
    at ProtoBuf.Reflect.Message.decode (/home/joojo/node_modules/protobufjs/ProtoBuf.js:1748:51)
    at ProtoBuf.Reflect.Field.decode (/home/joojo/node_modules/protobufjs/ProtoBuf.js:2196:46)
    at ProtoBuf.Reflect.Message.decode (/home/joojo/node_modules/protobufjs/ProtoBuf.js:1746:51)
    at Function.Message.decode (/home/joojo/node_modules/protobufjs/ProtoBuf.js:1630:41)
    at decode (/home/joojo/public_html/api/control/protoBuffer.js:94:52)
    at Object.module.exports.decode (/home/joojo/public_html/cageapi/control/protoBuffer.js:110:10)
    at decode (/home/joojo/public_html/api/control/messageStructurer.js:82:33)
    at Object.module.exports.decode (/home/joojo/public_html/api/control/messageStructurer.js:94:10
    at CleartextStream.month (/home/joojo/public_html/api/connectionHandler.js:83:32)

不知道发生了什么事情,这种情况已经发生了几次。如何修复?
1个回答

3
我同意这个实现。该数据仅有一个字段 - 字段号为1,长度前缀(可以是字符串、二进制或子消息或打包数组); 如果我们猜测将其解释为字符串(在protouf中始终为UTF-8),它会显示为"GW_-18_9929",看起来很正常。
然而,您的消息将字段1声明为int64。字符串/长度前缀的线路类型(线路类型2)对于int64无效 - 实际上,唯一有效的线路类型是64位(线路类型1)。
所以: 您的数据是有效的,但它不符合您声称的模式。
解密方法如下:
  • 0a是二进制1010 - 最后三位(010)是线路类型,2 = 长度限定; 剩余的1是字段编号:1
  • 0b是十一,是接下来的字段的长度
  • 47 57 5f 2d 31 38 5f 39 39 32 39是有效负载,UTF-8表示"GW_-18_9929"

哇!太好了...谢谢你。我尝试使用protoc --decode_raw解码,但没有成功... - Filipe Tagliacozzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接