Buffer缓冲器

    科技2026-01-29  9

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

    Processed: 0.014, SQL: 9