2016年2月8日月曜日

node Readable readメソッドの戻り値のバッファについて

nodeのReadableオブジェクトのreadメソッドですが、
readメソッドの引数には、readメソッド実行結果のバッファのバイト数を設定することができるのですが、このバッファの値は、どのように設定されるのか確認してみました。

さて、確認方法ですが、以前にnodeのファイルアップロード処理の記事を書きましたが、
そのファイルアップロードされた内容をReadableオブジェクトのreadメソッドで取得してみました。

ファイル内容は次の通りです。
=== test.txt ===

abcあ


そして、app.jsで今回、確認でコーディングした部分です。(app.js全体でなく、該当部分のみです。)
=== app.js ===

var fs = require('fs');

app.post('/up', upload.single('upFile'), function (req, res, next) {
    var readableStream = fs.createReadStream(req.file['path']);
    readableStream.on('readable', function() {
        var chunk;
        while (null !== (chunk = readableStream.read(8))) {
            console.log('chunk[' + chunk + ']');
            for (var i = 0; i < chunk.length; i++) {
                console.log("chunk[" + i + "] = " + chunk[i] + " : chunk[" + i + "].toString(16) = " + chunk[i].toString(16));
            }

        }
    });
    res.render('index');
});


実行結果は、次の通りです。

chunk[abcあ
]
chunk[0] = 97 : chunk[0].toString(16) = 61
chunk[1] = 98 : chunk[1].toString(16) = 62
chunk[2] = 99 : chunk[2].toString(16) = 63
chunk[3] = 227 : chunk[3].toString(16) = e3
chunk[4] = 129 : chunk[4].toString(16) = 81
chunk[5] = 130 : chunk[5].toString(16) = 82
chunk[6] = 10 : chunk[6].toString(16) = a

readメソッドの実行結果のバッファそのものは、ファイル内容の文字列そのものです。
そして、そのバッファを1つずつ、取り出した内容ですが
"a"の文字は、97になっています。これは、UTF8のaを10進数にしているから、97なのです。なので、16進数だと、61ですね。
ちなみに、"あ"の文字の場合は、3バイトなので、16進数だと、e3,81,82になります。
この場合、繰り返しますが、1文字3バイトです。
なので、バッファリング後に文字列処理がある場合を考慮して
バッファリングする時に、文字コードを判定して、1文字に何バイトかの判断が必要になります。
例えば、"あ"の文字の場合に、e3,81のみで、82を次の文字と判断したらいけないです。
e3,81,82です。

0 件のコメント :

コメントを投稿