node.js基础(五):buffer

292 阅读4分钟

编码

a->0 b->1 c->2 d->3

aabbcd->001123

常见的编码规则

  • ascii
  • utf-8
  • gbk
  • base64

unicode编码

  • 将每个字节转为两个十六进制字符

buffer概述

Buffer对象是Node.js用来处理二进制数据的一个接口(保存原始数据)

JavaScript比较擅长处理Unicode数据, 对于处理二进制格式的数据(比如TCP数据流),就不太擅长。 Buffer对象就是为了解决这个问题而提供的。 该对象也是一个构造函数,它的实例代表了V8引擎分配的一段内存,基本上是一个数组,成员都为整数值。

Buffer是Node原生提供的全局对象,可以直接使用,不需要require('buffer')。 Buffer对象与字符串的互相转换,需要指定编码格式。目前,Buffer对象支持以下编码格式。

  • ascii
  • utf8
  • utf16le:UTF-16的小头编码,支持大于U+10000的四字节字符。
  • ucs2
  • base64
  • hex

Buffer构造函数

Buffer作为构造函数,可以用new命令生成一个实例,它可以接受多种形式的参数。

// 参数是整数,指定分配多少个字节内存
var hello = new Buffer(5);

// 参数是数组,数组成员必须是整数值
var hello = new Buffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
hello.toString() // 'Hello'

// 参数是字符串(不省略编码)
var hello = new Buffer('Hello', 'utf8');

// 参数是字符串(默认为utf8编码)
var hello = new Buffer('Hello');



// 参数是另一个Buffer实例,等同于拷贝后者
var hello1 = new Buffer('Hello');
var hello2 = new Buffer(hello1);

实例属性

length

length属性返回Buffer对象所占据的字节长度,而不是字符串的长度

var str = '我是字符串';
console.log(str.length); // 5

var buffer = new Buffer(str, 'utf-8'); 
console.log(buffer.length); //15

实例方法

write()

write方法可以向指定的Buffer对象写入数据。 它的第一个参数是所写入的内容, 第二个参数(可省略)是所写入的起始位置(从0开始), 第三个参数(可省略)是编码方式,默认为utf8。

var buf = new Buffer(5);
buf.write('He');
buf.write('l', 2);
buf.write('lo', 3);
console.log(buf.toString());
// "Hello"

toString()

toString方法将Buffer对象,按照指定编码(默认为utf8)转为字符串。

var hello = new Buffer('Hello');
hello // <Buffer 48 65 6c 6c 6f>
hello.toString() // "Hello"

toString方法可以只返回指定位置内存的内容, 第二个参数表示起始位置, 第三个参数表示终止位置, 两者都是从0开始计算。

var buf = new Buffer('just some data');
console.log(buf.toString('ascii', 5, 9));
// "some"

toJSON()

toJSON方法将Buffer实例转为JSON对象。如果JSON.stringify方法调用Buffer实例,默认会先调用toJSON方法。先将其转化为json对象,再转化为字符串。

var buf = new Buffer('test');
var json = JSON.stringify(buf);
json // '[116,101,115,116]'

var copy = new Buffer(JSON.parse(json));
copy // <Buffer 74 65 73 74>

var copy = new Buffer({ type: 'Buffer', data: [ 116, 101, 115, 116 ] });//后面转化为10进制

buffer与字符串转换

var buf = new Buffer('shiyueyi');
var str = buf.toString('base64'); //c2hpeXVleWk=

var buf = new Buffer('c2hpeXVleWk=', 'base64');
var str = buf.toString('utf-8'); //shiyueyi

var str = buf.toString('hex'); //7368697975657969
var buf = new Buffer('7368697975657969', 'hex');
var str = buf.toString('utf-8');//shiyueyi

不管什么编码方式,都可以得到原始数据

实例:读取图片的数据

ffer = require('buffer').Buffer;
fs.readFile('slogo.png', function(err, origin_buffer){
    if(err){
        throw err;
    }
    //没有指定编码,回调函数的第二个参数是buffer
    console.log( Buffer.isBuffer(origin_buffer) )

    //转换成二进制数据转换成base64编码的字符串
    var base64Img = origin_buffer.toString('base64');
    //查看字符串
    console.log(base64Img);
    
    //创建一个新的buffer
    var newBuffer = new Buffer(base64Img, 'base64');
    //使用newBuffer创建文件
    fs.writeFile('logo_copy.png', newBuffer,function(err){
        if(err){
            console.log(err);
        }
    })
})

类的静态方法

Buffer.isEncoding()

Buffer.isEncoding方法返回一个布尔值,表示Buffer实例是否为指定编码。

Buffer.isBuffer()

Buffer.isBuffer方法接受一个对象作为参数,返回一个布尔值,表示该对象是否为Buffer实例。

Buffer.isBuffer(Date) // false

Buffer.byteLength()

Buffer.byteLength方法返回字符串实际占据的字节长度,默认编码方式为utf8。

Buffer.byteLength('Hello', 'utf8') // 5

Buffer.concat()

Buffer.concat方法将一组Buffer对象合并为一个Buffer对象。

var i1 = new Buffer('Hello');
var i2 = new Buffer(' ');
var i3 = new Buffer('World');
Buffer.concat([i1, i2, i3]).toString()
// 'Hello World'

Buffer.concat方法还可以接受第二个参数,指定合并后Buffer对象的总长度。多出去的那几位就不要了。

var i1 = new Buffer('Hello');
var i2 = new Buffer(' ');
var i3 = new Buffer('World');
Buffer.concat([i1, i2, i3], 10).toString()
// 'Hello Worl'