はじめてのNode.js:Node.js内でバイナリデータを扱うための「Buffer」クラス 3ページ

Buffer型オブジェクトのコピー——buf.copyメソッド

 Buffer型オブジェクトに格納されているバイナリデータを別のオブジェクトに書き込むには、copyメソッドを使用する。

buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])

 targetBuffer引数には書き込み先となるBuffer型オブジェクトを指定する。書き込み先の位置はtargetStart引数で、書き込むデータの範囲はsourceStartおよびsourceEnd引数で指定できる。targetStartおよびsourceStartのデフォルト値は0、sourceEndのデフォルト値はbuffer.lengthとなっている。次の例は、bオブジェクトの10バイト目以降にaオブジェクトの内容を書き込むものだ。

> a = Buffer('本日は晴天なり')
<Buffer e6 9c ac e6 97 a5 e3 81 af e6 99 b4 e5 a4 a9 e3 81 aa e3 82 8a>
> b = Buffer(128)
<Buffer 0f 84 a5 00 00 00 8b c2 48 83 e0 05 83 f8 04 0f 85 b1 09 00 00 83 fa 7e 0f 84 12 00 00 00 83 fa 5e 0f 84 09 00 00 00 83 fa 24 0f 85 96 09 00 00 48 8d 47 ...>
> b.fill(0) // bの内容を0に初期化
undefined
> b
<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>
> a.copy(b, 10) // bの10バイト目以降にaの値を書き込む
21
> b
<Buffer 00 00 00 00 00 00 00 00 00 00 e6 9c ac e6 97 a5 e3 81 af e6 99 b4 e5 a4 a9 e3 81 aa e3 82 8a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>
> 

Bufferクラスのクラスメソッド——Buffer.isBufferメソッド、Buffer.byteLengthメソッド、Buffer.concatメソッド

 Bufferクラスには3つのクラスメソッドが用意されている。1つめは、引数として与えたオブジェクトがBuffer型のオブジェクトかどうかを判別するisBufferメソッドだ。

Buffer.isBuffer(obj)

 isBuffer関数はobj引数で指定されたオブジェクトがBuffer型のオブジェクトの場合trueを、そうでない場合はfalseを返す。

> a = 'aaa'
'aaa'
> b = Buffer(10)
<Buffer 81 61 d1 f4 9a 32 00 00 e1 98>
> typeof a  // aは文字列(string)型
'string'
> typeof b // bはBuffer型だが、typeofキーワードではobjectであることしか判別できない
'object'
> Buffer.isBuffer(a) // aは文字列なのでfalseを返す
false
> Buffer.isBuffer(b) // bはBuffer型なのでtrueを返す
true

 また、byteLengthメソッドは指定した文字列のバイト長を計算するメソッドだ。Stringクラスのlengthプロパティで得られる文字数ではなく、バイト長が必要なときに利用できる。

Class Method: Buffer.byteLength(string, [encoding])

 string引数にはバイト長を取得したい文字列、encoding引数には計算に使用するエンコーディングを指定する。encodingが省略された場合、utf8が指定されたものとして計算される。

> a = '本日は晴天なり'
'本日は晴天なり'
> a.length // lengthプロパティには文字数が格納される
7
> Buffer.byteLength(a, 'utf8') // 「本日は晴天なり」をUTF-8で表現するとそのバイト長は21バイトとなる
21
> Buffer.byteLength(a, 'utf16le') // 「本日は晴天なり」をUTF16LEで表現するとそのバイト長は14バイトとなる
14

 byteLengthメソッドはBASE64形式に変換されたバイナリデータや16進数で表記されたバイナリデータの長さを取得するのにも利用できる。

> Buffer.byteLength('5pys5pel44Gv5pm05aSp44Gq44KK', 'base64')
21
> Buffer.byteLength('e69cace697a5e381afe699b4e5a4a9e381aae3828a', 'hex')
21

 concatメソッドでは、複数のバッファを結合して新たなバッファを作成できる。

Buffer.concat(list, [totalLength])

 list引数には結合するBuffer型オブジェクトを格納した配列を、totalLength引数には結合結果を格納するBuffer型オブジェクトのサイズを指定する。totalLength引数が指定されなかった場合、list引数で指定されたBuffer型オブジェクトのサイズを合計したものが使われる。

【連載】はじめてのNode.js

本記事について

 本記事は、3月13日にソフトバンク クリエイティブより発売された書籍「はじめてのNode.js -サーバーサイドJavaScriptでWebアプリを開発する-」から、「第7章 Node.jsアプリケーションのデバッグ方法」の一部を抜き出し再構成したものです。

 出版社ページ / Amazon.co.jpの商品ページ

 大型本: 384ページ、価格:3,045円(税込)、ISBN: 978-4797370904