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)

何が起こっているのかわからない、それは数回起こった. 修正方法は?

4

1 に答える 1

3

実装に同意する必要があります。そのデータは 1 つのフィールドのみです - フィールド番号 1、長さのプレフィックス (文字列、バイナリ、またはサブメッセージ編集またはパック配列の可能性があります)。投機的に文字列 (protouf では常に UTF-8) として解釈すると、正常"GW_-18_9929"に見える として出力されます。

ただし、メッセージはフィールド 1 を として宣言しましint64た。string/length-prefix ワイヤー タイプ (ワイヤー タイプ 2) は int64 では無効です。実際、有効なワイヤー タイプは 64 ビット (ワイヤー タイプ 1) だけです。

したがって、データは有効ですが、主張して​​いるスキーマと一致しません。

スクランブル解除するには:

  • 0a は 2 進数の 1010 です。最後の 3 ビット (010) はワイヤ タイプです。2 = 長さで区切られています。残りの 1 はフィールド番号です: 1
  • 0b は 10 進数の 11 で、その後に続くフィールドの長さです。
  • 47 57 5f 2d 31 38 5f 39 39 32 39 はペイロード、UTF-8 は"GW_-18_9929"
于 2013-09-09T20:06:05.590 に答える