Buffer缓冲器
Buffer 对象是 Node 处理二进制数据的一个接口。它是 Node 原生提供的全 局对象,可以直接使用,不需要 require('buffer')。
Buffer是一个和数组类似的对象,用于存储数据,存储的是二进制数据
特点:
1.效率高。存储和读取数据很快,可以直接对计算机的内存和CPU进行操作
2.Buffer的大小一旦确定了,不可修改
3.成员都为 0 到 255 的整数值,即一个 8 位的字节。
4.Buffer是Node中的非常核心的模块,无需下载,无需引入,直接即可使用
1.Buffer是什么?
- 1.它是一个【类似于数组】的对象,用于存储数据(存储的是二进制数据)。
- 2.Buffer的效率很高,存储和读取很快,它是直接对计算机的内存进行操作。
- 3.Buffer的大小一旦确定了,不可修改。
- 4.成员都为 0 到 255 的整数值,即一个 8 位的字节。
- 5.Buffer是Node中的非常核心的模块,无需下载、无需引入,直接即可使用
2.进制相关
十六进制:00 -------- ff
二进制:00000000 ------ 11111111
计算机单位换算
8位(bit) = 1字节(Byte)
1024Byte = 1Kb
1024KB = 1Mb
1024Mb = 1Gb
与二进制数组的关系
补充:
构造函数:初始化对象
类:具有相同属性和行为的对象集合
属性:对象的静态特征
对象(实例):类的实例化
类方法:通过类名直接调用,这类方法为类的所有对象共享
实例方法:通过对象名来调用,不同的对象调用,效果不同
buffer类是基于Int8Array,所以范围是0-255
Int8Array是一个二进制数组,占有一个字节,每个字节占用255个
3.创建实例对象
1.创建一个Buffer的实例对象--------性能特别差------1.在堆里开辟空间。2.清理
let buf = new Buffer(10)
console.log(buf)
2.创建一个Buffer的实例对象--------性能比new Buffer()稍强一点------在堆中开辟一块空间(该块空间没有人用过)
//申请一个缓冲区,这个缓冲区共有十个单元,每个单元都用0来填充
const buf1 = Buffer.alloc(10) //开辟十个单元
console.log(buf1)
//申请一个缓冲区,这个缓冲区共有十个单元,每个单元都用0来填充
const buf2 = Buffer.alloc(10,5)
console.log(buf2)
3.创建一个Buffer的实例对象--------在堆中开辟一块空间(该块空间包含旧数据)
可以通过fill() write()来覆盖旧值
const buf3 = Buffer.allocUnsafe(10)
4.将数据存入一个Buffer实例
const buf = Buffer.from([1,2,3])
console.log(buf)
同时可以指定编码格式
5.buffer中传入数据
// 生成一个 256 字节的 Buffer 实例
for(var i=0;i<bytes.length;i++){
bytes[i] = i;
}
console.log(bytes)
var bytes = new Buffer(256)
for(var i=0;i<bytes.length;i++){
//对buffer里面的内容进行赋值
bytes[i] = i+1;
}
// console.log(bytes)
// 对buffer缓存进行切片
var end = bytes.slice(240,256);
console.log('第一个元素'+end[0]);
console.log('最后一个元素'+end[end.length])
6.通过copy函数进行缓冲区的拷贝
var bytes = new Buffer(8)
for(var i=0;i<bytes.length;i++){
bytes[i] = i;
}
console.log(bytes);
var more = new Buffer(4)
bytes.copy(more,0,4,8) //开始拷贝types的[4,8)里面的内容,从more的第0个字节开始存
console.log(more)
-
1.输出的Buffer为什么不是二进制? ----- 输出的是16进制,但是存储的是二进制吗,输出的时候会自动转16进制。
-
2.输出的Buffer不为空? ----- 在堆里开辟空间,可能残留着别人用过的数据,所以allocUnsafe
let buf3 = Buffer.allocUnsafe(10) console.log(buf3)
7.Buffer的构造函数
在解析运行时,会自动将转为ASCII码对应的字母
// 参数是整数,指定分配多少个字节内存
var hello = new Buffer(5);
// 参数是数组,数组成员必须是整数值
var hello = new Buffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
console.log(hello.toString())
// 参数是字符串(默认为 utf8 编码)
var hello = new Buffer('Hello');
hello.length // 5
hello.toString() // "Hello"
// 参数是字符串(不省略编码)
var hello = new Buffer('Hello', 'utf8');
// 参数是另一个 Buffer 实例,等同于拷贝后者
var hello1 = new Buffer('Hello');
var hello2 = new Buffer(hello1)
const buf1 = new Buffer([0x48,0x65,0x6c,0x6c,0x6f]);
console.log(buf1.toString())
- 1.输出的为什么不是我们曾经存入的字符串?用户存储的不一定是字符串,可能是媒体类型的文件
- 2.如何能够让输出的东西是字符串(我们能看懂的)?toString()
4.Buffer支持的编码格式
- ASCII: a:97,A:65,‘0’:48,0:0,‘ ’(空格):32
- UTF-8
- UTF16LE:UTF-16的小端编码,支持大于U+10000的四字节字符
- ucs2:utf16le 的别名。
- base64
- hex:将每个字节转为两个十六进制字符。
5.Buffer类的函数
1.Buffer.isEncoding(’’)
判断当前缓冲区的编码格式。返回一个布尔值,表示 Buffer 实例是否为指定编码。
console.log(Buffer.isEncoding('UTF8'))
2.Buffer.isBuffer()
判断当前实例是否为buffer对象
const buf8 = new Buffer('Hello');
console.log(buf8.length)
const date = new Date()
console.log(Buffer.isBuffer(buf8))
console.log(Buffer.isBuffer(date))
3.Buffer.bytenLength()
返回Buffer的长度
var len = Buffer.byteLength(buf1)
console.log(len)
4.Buffer.concat([],n)
拼接Buffer对象
n可以指定Buffer拼接后的字符长度(可选参数)
var buf2 = Buffer.concat([buf,buf1]).toString();
console.log(buf2)
var buf2 = Buffer.concat([buf,buf1],5).toString();
console.log(buf2)
6.Buffer实例属性
1.length
返回Buffer对象所占的内存长度,与实例对象本身内容无关
如果想知道一个字符串所占据的字节长度,可以将其传入 Buffer.byteLength 方法。
console.log(buf8.length)
console.log(Buffer.byteLength(buf8))
7.实例方法
1.write()
可以向指定的 Buffer 对象写入数据。它的第一个参数是所写入的内容,第二个参数是写入的起始位置(可选),第三个参数为编码方式(可选,默认为UTF-8)
var buf10 = new Buffer(5)
buf10.write('He')
buf10.write('l',2)
buf10,write('lo',3)
console.log(buf10.toString())
2.slice()
返回一个按照指定位置、从原对象切割出来的 Buffer 实例。它的两 个参数分别为切割的起始位置和终止位置。
var buf = new Buffer('just some data');
console.log(buf.slice(5,9).toString())
3.toString()
将 Buffer 实例,按照指定编码(默认为 utf8)转为字符串
4.toJSON()
将 Buffer 实例转为 JSON 对象。如果 JSON.stringify 方法调用 Buffer 实例,默认会先调用 toJSON 方法。
const buf8 = new Buffer('Hello');
var json = JSON.stringify(buf8);
var copy = new Buffer(JSON.parse(json))
console.log(copy)