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);

Другие вопросы по тегам