🤫

console.logで見る限りでは一致している二つの文字列が===だとfalseになる。

2022/05/14に公開

発端

ExpectedReceiveがどう見ても一緒なのに比較がコケる。toBeじゃなくてtoEqualにしたけど全部ダメだった。

結論

色々と処理をしていて、Bufferのサイズを大きく取りすぎていた。Hello Worldに必要なサイズは11だが、20を取っていた。例えば、このコードは失敗する。

コピペして気付いたが、後ろにヌル文字がいっぱい付いてた。

    const buf = Buffer.from('Hello World', 'utf-8');
    const arr1 = new Uint8Array(buf);
    const arr2 = new Uint8Array(20); // arr1よりも大きいサイズ
    arr2.set(arr1);
    const restored = Buffer.from(arr2).toString();
    console.log(restored); // => Hello World
    console.log(restored === 'Hello World'); // => false

解決策として、toStringする時に元の文字列のサイズを持っておくと良い。

    const buf = Buffer.from('Hello World', 'utf-8');
    const arr1 = new Uint8Array(buf);
    const arr2 = new Uint8Array(20); // arr1よりも大きいサイズ
    arr2.set(arr1);
    const restored = Buffer.from(arr2).toString('utf-8', 0, 'Hello World'.length);
    console.log(restored); // => Hello World
    console.log(restored === 'Hello World'); // => true

ヌル文字を良い感じにStripする方法があると良いんだが・・・・(正規表現で出来るらしいけど標準で欲しさはある。)

Discussion