Nodejsでのバイナリの取り扱い
よくわかっていなかったので整理した。
Bufferオブジェクト
Node.jsではバイナリデータはBufferオブジェクトで扱う。
ArrayBuffer
実際のメモリに格納されたバイナリデータを配列で表現したもの。読み込み専用。
Uint8Array
バイナリデータを8bitごとに区切って配列にしたもの。1つの要素には0~255の値が入る。変更可能。
// 128バイトのバッファを作成 // 初期化はされない let buf = new Buffer(128); console.log('定義だけ', buf); // バッファに0を書き込む buf.fill(0); console.log('0で初期化', buf); // 10バイト目から20バイト目まで2を書き込む // (先頭は0と数える) buf.fill(2, 10, 30); console.log('2バイトで一部初期化', buf); // 文字列をバイナリ化 buf = Buffer.from('テスト文字列', 'utf8'); console.log('文字列バイナリ', buf); console.log('文字列のバイト数', buf.length); console.log('元の文字列を出力', buf.toString('utf8')); // bufferをArrayBufferにする function toArrayBuffer(buffer) { var ab = new ArrayBuffer(buffer.length); var view = new Uint8Array(ab); for (var i = 0; i < buffer.length; ++i) { view[i] = buffer[i]; } return ab; } buf = Buffer.from('TEST', 'utf8'); let arrayBuf = toArrayBuffer(buf); console.log('ArrayBuffer', arrayBuf); // arrayBufferからBufferを作る buf = Buffer.from(arrayBuf); console.log('arrayBufから作成したBuffer', buf); // ファイルを読み込む let fs = require('fs'); buf = fs.readFileSync('./buf.js'); console.log('ファイルのバイナリデータ', buf); // axiosでバイナリデータを取得するときは // responseTypeに arraybuffer を指定する // そうすることで、arrayBufferオブジェクトとして受け取れる // let client = axios.create({ // 'responseType': 'arraybuffer', // }); // Bufferオブジェクトかどうかのチェック console.log('Bufferかどうかチェック', Buffer.isBuffer(buf));
補足
html5のJSにはBufferはない。Blobで扱う。
https://www.sejuku.net/blog/67735#Blob-2
ArrayBufferをBlobに変換
http://var.blog.jp/archives/62330155.html