我需要将两个现有的arrayBuffer的两个部分合并成一个新的arrayBuffer。
我正在构建一个解析器,数据以随机大小的arrayBuffer形式出现,数据会溢出一个数组缓冲区的末尾,并进入另一个数组缓冲区的开头。因此,我需要创建一个新的输出缓冲区,并复制一个缓冲区末尾的一部分和另一个缓冲区开头的一部分。输出将只是一个Arraybuffer。
从这个演示开始,我打算使用一些偏移量创建Uint8Arrays,然后使用set,但问题是某些组合会抛出“Invalid typed array length”的错误。我事先不知道每个数组或偏移量的长度。
我正在构建一个解析器,数据以随机大小的arrayBuffer形式出现,数据会溢出一个数组缓冲区的末尾,并进入另一个数组缓冲区的开头。因此,我需要创建一个新的输出缓冲区,并复制一个缓冲区末尾的一部分和另一个缓冲区开头的一部分。输出将只是一个Arraybuffer。
从这个演示开始,我打算使用一些偏移量创建Uint8Arrays,然后使用set,但问题是某些组合会抛出“Invalid typed array length”的错误。我事先不知道每个数组或偏移量的长度。
var buffer1 = new ArrayBuffer(8);
var buffer2 = new ArrayBuffer(8);
var buffer3 = new ArrayBuffer(8);
var uint8_1 = new Uint8Array(buffer1);
var uint8_2 = new Uint8Array(buffer2);
var uint8_3 = new Uint8Array(buffer3);
uint8_1.fill(1);
uint8_2.fill(2);
var uint8_1_slice = new Uint8Array(buffer1 , 0 , 3);
var uint8_2_slice = new Uint8Array(buffer2 , 4, 7);
为了这个演示,需要将buffer3设置为1,1,1,1,2,2,2,2。
无法使用切片
concatenate(new Uint16Array([1,2,3]))
返回[1, 2, 3, 0, 0, 0]而不是[1, 0, 2, 0, 3, 0]。问题在于Uint8Array.set()遍历给定类型数组的元素而不是字节。解决方法是将result.set(arr, offset)
更改为result.set(new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength), offset)
。(请注意,对ArrayBuffer参数的支持需要额外的逻辑。) - tom