Buffer缓冲器

Buffer

buffer的本质就是字节数组,并且Buffer 类在全局作用域中,因此无需使用 require(‘buffer’)来引入该模块。

实例化buffer对象

定义buffer对象的长度

方法一:new Buffer(长度)

let buf = new Buffer(5);
console.log(buf)
//<Buffer 00 00 00 00 00>

该方法不推荐使用。

方法二:

let buf = Buffer.alloc(5)
console.log(buf)
//<Buffer 00 00 00 00 00>

<Buffer 00 00 00 00 00>,返回16进制的结果,并且该结果是随机产生的。

Buffer.from(array)

使用 0 – 255 范围内的字节数组 array 来分配一个新的 Buffer。 超出该范围的数组条目会被截断以适合它。

let buf = Buffer.from('hello')
console.log(buf)
//<Buffer 68 65 6c 6c 6f>

同时可以通过toString方法将16进制数转化为字符串

let buf1 = Buffer.from([0x68,0x65,0x6c,0x6c,0x6f])
console.log(buf1.toString())
//  hello

由此可以看出返回值省略了0x前缀。

Buffer功能方法

1.Buffer.isEncoding():判断是否支持该编码格式

console.log(Buffer.isEncoding('utf8'))
console.log(Buffer.isEncoding('ucs2'))

支持的编码格式有:
hex
utf8
ascii
binary
base64
ucs2
ucs-2
utf16le
utf-16le
raw

2.Buffer.isBuffer():判断是否为Buffer

let buf = Buffer.from('loop')
let str = 'hello';
console.log(Buffer.isBuffer(buf))   //true
console.log(Buffer.isBuffer(str))    //false

3.Buffer.byteLength():返回执行编码的字节长度,默认编码格式为utf-8.

let buf = Buffer.from('loop')
let buf1 = Buffer.from('我爱我家')
console.log(Buffer.byteLength(buf))    // 4
console.log(Buffer.byteLength(buf1))    // 12

由此可见utf-8编码格式下,一个字母对应一个字节,一个汉字对应三个字节。但可以通过改变编码格式来改变输出。

let buf1 = Buffer.from('我爱我家','ascii')
console.log(Buffer.byteLength(buf1))  // 4
console.log(buf1.toString())		//1�

在使用ascii码后,一个汉字对应一个字节,但是将其转化为字符串后,会出现乱码。所以对于汉字来说,不支持ASCii码,因此在写前端或后台接口返回数据时要规定返回格式为utf-8,只有这种格式允许对汉字进行编码。

4.Buffer.concat():将一组Buffe对象合并为一个Buffer对象。

let buf1 = Buffer.from('hello ');
let buf2 = Buffer.from('world');
let buf3 = Buffer.concat([buf1,buf2]);
console.log(buf3.toString())
//hello world

5.Buffer.write(str,offset,integer):将str按要求写入buf对象
offset为开始写入前要跳过的字节数;
integer为要写入的最大字节数(最大为str.length-offset)

let buf = Buffer.alloc(5)
let buf1 = Buffer.alloc(5)
let buf2 = Buffer.alloc(5)
buf.write('hello',2,3)
buf1.write('hello',2,5)
buf2.write('hello',2,2)
console.log(buf.toString())   //  hel
console.log(buf1.toString())    //  hel
console.log(buf2.toString())    //he

如果integer的值大于length-offset,则还是会按照最大值进行写入。

注意事项
let buf = Buffer.from('hello')
let buf1 = buf.slice();
console.log(buf1.toString())		//hello
console.log(buf==buf1)		//false

比较的并不是hello,而是这两个在内存中的地址。只要是对象,存储的地址不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值