Buffer

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)
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页