Lorsque vous travaillez avec des données binaires, il arrive que vous souhaitiez combiner plusieurs Uint8Array en un seul. Par exemple, lors de la reconstitution de morceaux reçus d’un téléchargement de fichier fragmenté.
Code
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));}Exemples d’utilisation
Fusionner plusieurs tableaux
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]Gérer les tableaux vides
const merged = mergeU8Array(new Uint8Array(), part1);// Les tableaux vides sont ignorés lors de la fusionDétails de l’implémentation
- D’abord, calculer la longueur totale en octets de tous les tableaux avec reduce
- Allouer un nouveau Uint8Array de cette taille
- Écrire chaque tableau séquentiellement avec la méthode set
- Gérer la position en avançant le offset
Bien que nous effectuions des effets secondaires dans reduce, nous utilisons la méthode set qui évite la copie au niveau des octets, ce qui rend l’implémentation relativement efficace.
hsb.horse