FledglingRobin’s diary

Github: https://github.com/FledglingRobin

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);