node.jsにおいて、文字列をbufferへ変換させたいときの方法をまとめます
環境 node.js 8.1.3
Bufferインスタンスをどう生成するか
node.js 8.x系におけるBufferインスタンスの作成において、 new Bufferは既にdepricatedになっている*1ため、ここではbufferインスタンスの作成はBuffer.allocを利用します。
Buffer | Node.js v8.1.3 Documentation
Buffer.alloc と Buffer.allocUnsafe
Buffer.alloc(size)の他に、インスタンス生成時にデータを初期化させないBuffer.allocUnsafe(size)があります。
Buffer.allocは、インスタンス生成時にデータをzero-filledする初期化コストがかかるため、Buffer.allocUnsafeよりパフォーマンスは劣りますが、sensitiveなデータを含まないことが保証されるので、速度を最優先させる場面以外において、基本的にBuffer.allocを使う方が良いかと思います。
https://nodejs.org/dist/latest-v8.x/docs/api/buffer.html#buffer_class_method_buffer_allocunsafe_size
文字列をbufferに変換する場合において、Buffer.allocを利用時にBufferサイズ指定する必要があります。 下記に文字列をBufferに変換するスクリプトにあるように、ここで毎回文字列のサイズを渡してBufferインスタンスを生成します。
function bufferFromString(str) { // Allocates a new Buffer of size bytes. // If fill is undefined, the Buffer will be zero filled; // set size of string length var buffer = Buffer.alloc(str.length) buffer.write(str) return buffer } const text1 = bufferFromString('hello'); const text2 = bufferFromString('wor'); console.log('----text1', text1); console.log('----text2', text2); // text1のbufferにworを書き込む text1.write('wor'); // 先頭の3文字分 のみ更新させるため、4,5文字目は変わらない // hello → worlo console.log(text1.toString('utf8'));
ただ、欠点なのは毎回Buffer.allock(size)でインスタンスを生成した後、Buffer.write()でデータを書き込む必要があるため、若干冗長です。
Buffer.from
Buffer.fromの引数に文字列を渡すと、一発で文字列をBufferに変換できます。
> Buffer.from("hello world") <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
まとめ
文字列からBufferへの変換方法をざっとまとめました。 Buffer.alloc Buffer.allocUnsafe Buffer.fromはそれぞれ挙動に違いがあるので、公式ドキュメントをちゃんと読んで、状況に応じて使い分けるとよいかと思います。