buffer的本质就是字节数组,并且Buffer 类在全局作用域中,因此无需使用 require(‘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进制的结果,并且该结果是随机产生的。
使用 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前缀。
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)) //false3.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 world5.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,则还是会按照最大值进行写入。
比较的并不是hello,而是这两个在内存中的地址。只要是对象,存储的地址不同
