🤫
console.logで見る限りでは一致している二つの文字列が===だとfalseになる。
発端
Expected
とReceive
がどう見ても一緒なのに比較がコケる。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