【问题标题】:ByteBuffer: readIString throwing illegal offset errorByteBuffer: readIString 抛出非法偏移错误
【发布时间】:2020-07-17 19:05:23
【问题描述】:

我有一个 javascript 应用程序正在运行。问题是当我尝试从 ByteBuffer 读取数据时,它会抛出以下错误:

2020-07-17T09:11:21.503Z error [shim:_]                                           Unhandled Rejection reason RangeError: Illegal offset: 0 <= 4 (+168295178) <= 1276 promise Promise {
  <rejected> RangeError: Illegal offset: 0 <= 4 (+168295178) <= 1276
    at ByteBuffer.module.exports.ByteBufferPrototype.readUTF8String (/usr/local/src/node_modules/fabric-shim/node_modules/bytebuffer/dist/bytebuffer-node.js:2117:27)
    at ByteBuffer.module.exports.ByteBufferPrototype.readIString (/usr/local/src/node_modules/fabric-shim/node_modules/bytebuffer/dist/bytebuffer-node.js:1955:24)
    at Chaincode.Invoke (/usr/local/src/app.js:46:54)
    at handleMessage (/usr/local/src/node_modules/fabric-shim/lib/handler.js:636:47)
    at ChaincodeSupportClient.handleTransaction (/usr/local/src/node_modules/fabric-shim/lib/handler.js:361:9)
    at ClientDuplexStream.<anonymous> (/usr/local/src/node_modules/fabric-shim/lib/handler.js:301:30)
    at emitOne (events.js:116:13)
    at ClientDuplexStream.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11) }

用于将 ByteBuffer 转换为字符串的函数如下:

transient.get('data').flip().readIString()

以下 json 字符串存储在 ByteBuffer 中:

{
        "transactionId": "xxxxxx",
        "collection": "xxxx",
        "requirementType": "xxxx",
        "requirementDisplayName": "xxxx",
        "locked": false 
};

我正在使用以下库
https://www.npmjs.com/package/bytebuffer

任何建议将不胜感激

【问题讨论】:

    标签: javascript node.js bytebuffer


    【解决方案1】:

    readIString(offset) 首先从指定(或当前)偏移量中读取一个 uint32 并将其用作字符串长度。

    // https://github.com/protobufjs/bytebuffer.js/blob/5.0.1/dist/bytebuffer-node.js
    var len = this.readUint32(offset);
    var str = this.readUTF8String(len, ByteBuffer.METRICS_BYTES, offset += 4);
    

    您的 ByteBuffer 在偏移量 0 处似乎没有正确的长度信息。

    如果知道字符串长度,可以直接调用readUTF8String(len, ByteBuffer.METRICS_BYTES)


    看来writeUTF8String(str, offset)没有写长度信息……

    // https://github.com/protobufjs/bytebuffer.js/blob/5.0.1/dist/bytebuffer-node.js
    k = Buffer.byteLength(str, "utf8");
    offset += this.buffer.write(str, offset, k, "utf8");
    

    https://nodejs.org/dist/latest-v12.x/docs/api/buffer.html#buffer_buf_write_string_offset_length_encoding

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      相关资源
      最近更新 更多