Javascript объединяет части ArrayBuffer
Мне нужно объединить 2 части 2 существующих arrayBuffers в новую.
Я создаю синтаксический анализатор, и данные поступают в буферные массивы случайных размеров, данные будут перетекать через конец одного в начало другого. Поэтому мне нужно создать новый выходной буфер и скопировать его в часть конца одного буфера и часть начала другого буфера. На выходе будет просто 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.
Нельзя использовать ломтик
2 ответа
Я видел, что некоторые люди используют только array.length
, Это нормально, если массив занимает всего 1 байт на элемент. Также хорошо, если другие типизированные массивы заполнены, но в этом примере a2
нет. Вот почему лучше использовать byteLength
это также, как конструктор Blob объединяет части.
// Concatenate a mix of typed arrays
function concatenate(...arrays) {
// Calculate byteSize from all arrays
let size = arrays.reduce((a,b) => a + b.byteLength, 0)
// Allcolate a new buffer
let result = new Uint8Array(size)
// Build the new array
let offset = 0
for (let arr of arrays) {
result.set(arr, offset)
offset += arr.byteLength
}
return result
}
// the total length of 1-3 = 5
// the total byteLength of 1-3 = 6
let a1 = Uint8Array.of(1, 2) // [1, 2]
let a2 = Uint16Array.of(3) // [3] just for the fun of it 16 takes up 2 bytes
let a3 = Uint8Array.of(4, 5) // [4, 5]
concatenate(a1, a2, a3) // [1, 2, 3, 0, 4, 5]
/********/
var blob = new Blob([a1, a2, a3])
var res = new Response(blob)
res.arrayBuffer().then(buffer => console.log(new Uint8Array(buffer)))
// [1, 2, 3, 0, 4, 5]
Для этой демонстрации необходимо получить buffer3 равным 1,1,1,1,2,2,2,2.
Ты можешь использовать for
петля, набор uint8_3
в uint8_1
значение, если переменная n
меньше чем uint8_1.byteLength / 2
еще установить uint8_3
ценить в uint8_2
,
var len = 8;
var buffer1 = new ArrayBuffer(len);
var buffer2 = new ArrayBuffer(len);
var buffer3 = new ArrayBuffer(len);
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);
// `len` : uint8_1.byteLength / 2 + uint8_2.byteLength / 2
for (var n = 0; n < len; n++) {
uint8_3[n] = n < len / 2 ? uint8_1[n] : uint8_2[n];
}
console.log(uint8_3);