如何在节点中使用带偏移量的类型化数组?

时间:2015-03-25 05:42:14

标签: javascript node.js typed-arrays

我正在使用jBinary编写一个mat文件解析器,它构建在jDataView之上。我有一个包含大量测试的工作解析器,但对于大小为10 MB的中等大小的数据集,它的运行速度非常慢。我使用look进行了分析,发现tagData花费了大量时间。在链接的tagData代码中,ints / uints / single / double / /从文件中逐个读取并推送到数组。显然,这不是超级有效的。我想用基础字节的类型化数组视图替换此代码,以删除所有读取和推送。

我已经开始迁移代码以使用类型化数组,如下所示。除了' miINT8'之外,新代码保留了所有类型的旧功能。新功能尝试查看缓冲区b,从偏移s开始,长度为l,与docs一致。我已经确认传递给s构造函数的Int8Array非零,甚至可以将其硬编码到5。在所有情况下,console.log(elems.byteOffset)的输出都是0.在我的测试中,我可以看到Int8Array确实从缓冲区的开头开始而不是在我想要的偏移s处。

我做错了什么?如何让类型数组从位置s而不是位置0开始?我已经在node.js版本10.25以及12.0上测试了这个,在每种情况下都有相同的结果。任何指导都会受到赞赏,因为我对此感到非常困惑!

tagData: jBinary.Template({
      baseType: ['array', 'type'],
      read: function (ctx) {
        var view = this.binary.view
        var b = view.buffer
        var s = view.tell()
        var l = ctx.tag.numBytes
        var e = s + l
        var elems
        switch (ctx.tag.type) {
          case 'miINT8':  
            elems = new Int8Array(b,s,l); view.skip(l); console.log(elems.byteOffset); break;

          default:
            elems = []
            while (view.tell() < e && view.tell() < view.byteLength) {
              elems.push(this.binary.read(ctx.tag.type))
            }
        }


        return elems
      }
  }),

0 个答案:

没有答案