多次切片JavaScript TypedArray

时间:2017-04-14 23:22:05

标签: javascript node.js v8 typed-arrays

我试图通过这个简单的代码片段将typedArray拆分成更小的块:

const buf = new Uint8Array([0x02, 0x00, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x61, 0x70, 0x70, 0x02])
const len = 5

for (let i=0; i<buf.length;){
  const chunk = buf.slice(i, len)
  console.log("Chunk", chunk, "from", i, "to", i + chunk.length)
  if (chunk.length) {
    i += chunk.length
  } else {
    console.log("Chunk is empty")
    break
  }
}

但我发现slice仅在第一次迭代时起作用,在下一次迭代时返回空块。

我注意到它也发生在Node.js中,如果我用第一行代替:

const buf = Buffer.from([0x02, 0x00, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x61, 0x70, 0x70, 0x02])

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:2)

类型化数组slice方法的第二个参数是结束点,而不是切片的长度(常规非类型化数组切片的工作方式相同)。

From MDN:

typedarray.slice([begin[, end]])

这意味着在第二次调用时,它会从5切换到5,或者是一个空切片。

相反,请buf.slice(i, i + len)

&#13;
&#13;
const buf = new Uint8Array([0x02, 0x00, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x61, 0x70, 0x70, 0x02])
const len = 5

for (let i=0; i<buf.length;){
  const chunk = buf.slice(i, i + len)
  console.log("Chunk", chunk, "from", i, "to", i + chunk.length)
  if (chunk.length) {
    i += chunk.length
  } else {
    console.log("Chunk is empty")
    break
  }
}
&#13;
&#13;
&#13;