Node.jsドキュメントからbase64エンコーディングをおさらい
Node.jsでbase64エンコーディング、と検索すると下記の方法を紹介したページがずらっと見つかる。
var buffer = new Buffer('変換前の文字列'); var string = buffer.toString('base64'); console.log(string);
$ node base64_test.js 5aSJ5o+b5YmN44Gu5paH5a2X5YiX
これってなんだろう、ということでおさらいをしてみる。
Bufferクラスは何か
Bufferクラスってなんだろう、ということで Buffer | Node.js v7.4.0 Documentation を読み直してみた。
BufferクラスはNode.js v7.4.0現段階でStable。もともとは、任意なバイナリデータ、octet-streamを扱うために使われていた。ECMAScript 2015 (ES6)でTypedArrayが導入された今は、Uint8Array
APIをNode.js向けに提供している。
TypedArrayは何か
ここで一度TypedArrayについておさらいする。Javascript typed arrays - JavaScript | MDNが読みやすかった。
TypedArrayはES6で導入された、バイナリデータを効率的に扱うための型付き配列。もともとJavaScriptで利用されているArray
が連想配列なのに対して、純粋な配列として機能する。
var uint8 = new Uint8Array(2); uint8[0] = 42;
例えば下記の型が提供されている。
- Int8Array
- Uint8Array
- Int16Array
- Uint16Array
- Float32Array
このうちUnit8Array
は、1バイト8 ビット長符号なし整数値を扱う。詳しくはECMAScript 2015 Language Specification – ECMA-262 6th Editionをみればいい。
結局Node.jsのBufferクラスは何をしているの
そのTypedArrayがES6に導入された今、Bufferクラスは何をしているのだろう。
BufferクラスはNode.jsが提供するクラスで、ES6で導入されたTypedArrayのUnit8Arrayを扱うクラスとして提供されている。Bufferクラスは固定長のバッファをメモリに確保する。
文字列については、Node.js v7.4.0 では下記8つのエンコード・デコードができる。
- ascii
- utf8
- utf16le
- ucs2
- base64
- latin1
- binary
- hex
例えば、10バイト確保して0埋めする。
const buf = Buffer.alloc(10);
例えば、文字列をASCIIのバイト列にしたときの長さ分確保して、バイト列を格納する。test
のASCIIコードは[0x74, 0x65, 0x73, 0x74]
になる。
const buf = Buffer.from('test');
例えば、同様のことをUTF-8で行う。
const buf = Buffer.from('tést', 'utf8');
fromを使わないコンストラクタの使用はv6.0.0で非推奨
冒頭で示したコードではnew Buffer(string[, encoding])
を使っていた。
var buffer = new Buffer('変換前の文字列'); var string = buffer.toString('base64'); console.log(string);
どうやら、Buffer | Node.js v7.4.0 Documentationによると、
Stability: 0 - Deprecated: Use Buffer.from(string[, encoding]) instead.
とのことで、v6.0.0以降のNode.jsを使う場合は上記のBuffer.fromを使うのがよいらしい。
// base64 エンコード const buf = Buffer.from('変換前の文字列'); const base64 = buf.toString('base64'); console.log(base64); // base64 デコード const string = Buffer.from(base64, 'base64'); console.log(string.toString());
$ node base64_test.js 5aSJ5o+b5YmN44Gu5paH5a2X5YiX 変換前の文字列
むすび
下記のコードは、バイナリデータを扱うためのクラスを利用してbase64エンコードを実施している。なお、Node.js v6.0.0以降はBuffer([string])が非推奨でBuffer.from([string])の使用が推奨されている。
var buffer = new Buffer('変換前の文字列'); var string = buffer.toString('base64'); console.log(string);