nodejs: 理解Buffer

学习nodejs中buffer这一章,有一段写到buffer的拼接,其中一段源码非常优美,特拿来与大家共享。

var chunks = [];
var size = 0;
res.on('data', function(chunk){
        chunks.push(chunk);
        size += chunk.length;
});

res.on('end', function(){
        var buf = Buffer.concat(chunks, size);
        var str = iconv.decode(buf, 'utf8');
        console.log(str);
})

 正确的拼接方式是用一个数组来存储接收到的所有Buffer片段并记录下所有的中长度。Buffer.concat方法封装了从小Buffer对象到大Buffer对象的复制过程,实现十分细腻,值得学习。

Buffer.concat = function(list, length)
{
        if(!Array.isArray(list))
        {
                throw new Error('Usage:Buffer.concat(list, [length])');
        }

        if(list.length === 0)
        {
                return new Buffer(0);
        }
        else if(list.length === 1)
        {
                return list[0];
        }

        if(typeof length !== 'number')
        {
                length = 0;
                for(var i=0; i<list.length; i++)
                {
                        var buf = list[i];
                        length += buf.length;
                }
        }

        var buffer = new Buffer(length);
        var pos = 0;
        for(var i=0; i<list.length; i++)
        {
                var buf = list[i];
                buf.copy(buffer, pos);
                pos += buf.length;
        }
        return buffer;
}