Buffer缓冲器

  Buffer缓冲器是什么

 1.Buffer 是一个数组类似的对象,不同的是 Buffer 是专门用来保存二进制数据的。
    2.Buffer 的效率很高,存储和读取很快,它是直接对计算机的内存进行操作。
    3.Buffer 的大小一旦确定了,不可修改。 4.每个元素占用内存的大小为 1 字节。
    5.Buffer 是 Node 中的非常核心的模块,无需下载,无需引入,直接即可使用。
 

 实例化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,而是这两个在内存中的地址。只要是对象,存储的地址不同

posted @   罗砂  阅读(168)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示