logo hsb.horse
← スニペット一覧に戻る

Snippets

Uint8Array の結合

複数の Uint8Array を1つにマージする TypeScript 関数。バイナリデータの結合に便利。

公開日: 更新日:

バイナリデータを扱っていると、複数の Uint8Array を結合したくなる場面が出てくる。例えばファイルを分割アップロードして受信したチャンクを元に戻す時などだ。

コード

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

使用例

複数の配列を結合

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]

空の配列も扱える

const merged = mergeU8Array(new Uint8Array(), part1);
// 空配列は無視されて結合される

実装の解説

  1. まず reduce で全配列の合計バイト長を計算
  2. そのサイズで新しい Uint8Array を確保
  3. 各配列を set メソッドで順次書き込み
  4. offset を進めながら配置位置を管理

reduce の中で副作用のある操作をしているが、バイト単位でのコピーが発生しない set メソッドを使うことで、比較的効率的に実装している。