Ao trabalhar com dados binários, há momentos em que você deseja combinar vários Uint8Arrays em um. Por exemplo, ao remontar chunks recebidos de um upload de arquivo dividido.
Código
function mergeU8Array(...arrays: Uint8Array[]): Uint8Array { const total = arrays.reduce((acc, cur) => acc + cur.byteLength, 0);
let offset = 0; return arrays.reduce<Uint8Array>((acc, cur) => { acc.set(cur, offset); offset += cur.byteLength; return acc; }, new Uint8Array(total));}Exemplos de Uso
Mesclar múltiplos arrays
const part1 = new Uint8Array([1, 2, 3]);const part2 = new Uint8Array([4, 5, 6]);const part3 = new Uint8Array([7, 8, 9]);
const merged = mergeU8Array(part1, part2, part3);// Uint8Array(9) [1, 2, 3, 4, 5, 6, 7, 8, 9]Lidar com arrays vazios
const merged = mergeU8Array(new Uint8Array(), part1);// Arrays vazios são ignorados durante a mesclagemDetalhes da Implementação
- Primeiro, calcular o comprimento total em bytes de todos os arrays usando reduce
- Alocar um novo Uint8Array desse tamanho
- Escrever cada array sequencialmente usando o método set
- Gerenciar a posição avançando o offset
Embora estejamos realizando efeitos colaterais dentro do reduce, usamos o método set que evita cópia em nível de byte, tornando esta uma implementação relativamente eficiente.
hsb.horse