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

Snippets

Uint8Array ヘルパー関数

new Uint8Array の呼び出しを簡潔にする TypeScript ラッパー関数。配列、ArrayBuffer、長さ指定の全パターンに対応。

公開日: 更新日:

WebCrypto API などでバイナリデータを扱うと、new Uint8Array を頻繁に呼び出すことになる。毎回長い構文を書くのは億劫なので、簡潔に書けるラッパーを用意した。

コード

const BYTE_LENGTH = "byteLength";
export function toU8Array(length: number): Uint8Array;
export function toU8Array(
array: ArrayLike<number> | ArrayBufferLike
): Uint8Array;
export function toU8Array(
buffer: ArrayBufferLike,
byteOffset?: number,
length?: number
): Uint8Array;
export function toU8Array(
arg1: number | ArrayLike<number> | ArrayBufferLike,
arg2?: number,
arg3?: number
): Uint8Array {
return typeof arg1 === "number"
? new Uint8Array(arg1)
: BYTE_LENGTH in arg1
? new Uint8Array(arg1, arg2, arg3)
: new Uint8Array(arg1);
}

使用例

指定した長さで初期化

const arr = toU8Array(32);
// Uint8Array(32) [0, 0, 0, ...] - ランダム値用のバッファとして

Base64 デコード後の変換

const base64 = "SGVsbG8gV29ybGQh";
const binary = Uint8Array.from(atob(base64), c => c.charCodeAt(0));
const arr = toU8Array(binary);

ArrayBuffer の一部をビューとして取得

const buffer = new ArrayBuffer(64);
const arr = toU8Array(buffer, 16, 16);
// 16バイト目から16要素分のビュー

実装のポイント

BYTE_LENGTH を定数として定義することで、minify 時の最適化を考慮している。型ガードの順序も重要で、まず number かどうかをチェックし、次に byteLength プロパティの有無で ArrayBufferLike を判定し、それ以外を ArrayLike として扱う。

シンプルな変換なら new Uint8Array で十分だが、型安全に統一的なインターフェースで扱いたい時にこのラッパーは有効だ。