10-NodeJS核心API-Buffer对象

2020-03-24  本文已影响0人  仰望_IT

0.准备知识

0.1计算机只能识别0和1(因为计算机只认识通电和断电两种状态),
0.2所有存储在计算机上的数据都是0和1组成的(数据越大0和1就越多)
0.3计算机中的度量单位

1 B(Byte字节) = 8 bit(位)
00000000 就是一个字节
111111111 也是一个字节
10101010 也是一个字节
任意8个 0或1的组合都是一个字节
1 KB = 1024 B
1 MB = 1024KB
1 GB = 1024MB

1.什么是Buffer?

中文文档

Buffer是NodeJS全局对象上的一个类, 是一个专门用于存储字节数据的类, 用于直接处理二进制数据
NodeJS提供了操作计算机底层API, 而计算机底层只能识别0和1, 所以就提供了一个专门用于存储字节数据的类

2.如何创建一个Buffer对象

2.1创建一个指定大小的Buffer

Buffer.alloc(size[, fill[, encoding]])
size Buffer 的所需长度。
fill用于预填充 Buffer 的值。默认值: 0
encoding 如果 fill 是一个字符串,则这是它的字符编码。默认值: 'utf8'

创建一个大小为 size 字节的新 Buffer。 如果 fill 为 undefined,则用零填充 Buffer。

let buf = Buffer.alloc(5);
console.log(buf);  // <Buffer 00 00 00 00 00>

如果指定了 fill, 则用指定的值来填充
【注意】通过console.log();来输出Buffer会自动将存储的内容转为16进制再输出
比如这里的17的十六进制是11

let buf = Buffer.alloc(5, 17);
console.log(buf);   // <Buffer 11 11 11 11 11>

2.2根据数组/字符串创建一个Buffer对象

Buffer.from(string[, encoding])
会将数组/字符串中的数据转换为二进制存储到Buffer中
abc分别对应的ASCII值是97, 98, 99转换为16进制就是61, 62, 63, 所以这里输出的是 <Buffer 61 62 63>
ASCII码对照表

let buf = Buffer.from("abc");
console.log(buf);  // <Buffer 61 62 63>

3.Buffer对象的本质

本质就是一个数组

let buf = Buffer.from("abc");
console.dir(buf);   // Buffer(3) [Uint8Array] [ 97, 98, 99 ]

可以通过索引操作Buffer

let buf = Buffer.from([1, 3, 5]);
console.log(buf);  // <Buffer 01 03 05>
buf[0] = 6;
console.log(buf);  // <Buffer 06 03 05>

4.Buffer实例方法

buf.toString([encoding[, start[, end]]])  将Buffer中的二进制数据转换成字符串
encoding  使用的字符编码。默认值: 'utf8'
start    开始解码的字节偏移量。默认值: 0
end     结束解码的字节偏移量(不包含)。默认值: buf.length

let buf = Buffer.from([97, 98, 99]);
console.log(buf.toString());  // abc
console.log(buf.toString("utf8", 1));   // bc
console.log(buf.toString("utf8",1, 2));  // b

buf.write(string[, offset[, length]][, encoding])  往Buffer中写入数据
string  要写入 buf 的字符串。
offset  开始写入string 之前要跳过的字节数。默认值: 0
length  要写入的字节数。默认值: buf.length - offset(总字节数减去跳过的字节数)。
encoding string 的字符编码。默认值: 'utf8'

let buf = Buffer.alloc(5);
console.log(buf);  // <Buffer 00 00 00 00 00>

buf.wirte("abcdef");
console.log(buf);  // <Buffer 61 62 63 64 65>
[注]因为在创建Buffer的时候已经指定了5个字节, 所以这里只能放下abcde
console.log(buf.toString());  // abcde

buf.wirte("abcdef", 2);
console.log(buf);  // <Buffer 00 00 61 62 63>
console.log(buf.toString());  // abc

buf.wirte("abcdef", 2, 2);
console.log(buf);  // <Buffer 00 00 61 62 00>
console.log(buf.toString());  // ab

buf.slice([start[, end]])  从指定位置截取新Buffer
start 新 Buffer 开始的位置。默认值: 0
end   新 Buffer 结束的位置(不包含)。默认值: buf.length
返回一个新的 Buffer,但是由 start 和 end 索引进行偏移和裁剪, 和JavaScript中字符串截取子串很像。

let buf1 = Buffer.from("abcdef");
let buf2 = buf1.slice(); // abcdef
let buf2 = buf1.slice(2); // cdef
let buf2 = buf1.slice(2, 4); // cd
console.log(buf2.toString());

buf.toJSON()  将Buffer实例转为JSON对象

let buf = Buffer.from("abcdef");
console.log(buf.toJSON());  // { type: 'Buffer', data: [ 97, 98, 99, 100, 101, 102 ] }

// 将JSON转换为对象
console.log(JSON.stringify(buf));   // {"type":"Buffer","data":[97,98,99,100,101,102]}
// 将对象转为JSON
let obj = JSON.stringify(buf);
console.log(JSON.parse(obj));  // { type: 'Buffer', data: [ 97, 98, 99, 100, 101, 102 ] }

5.Buffer静态方法

Buffer.isEncoding(encoding)  检查是否支持某种编码格式

let res1 = Buffer.isEncoding("utf8");
console.log(res1);   // true
let res2 = Buffer.isEncoding("gbk");
console.log(res2);  // false

Buffer.isBuffer(obj)  检查是否是Buffer类型对象

let buf = Buffer.alloc(5);
console.log(Buffer.isBuffer(buf));  // true
let obj = {};
console.log(Buffer.isBuffer(obj));  // false

Buffer.byteLength(string[, encoding])  获取Buffer实际字节长度

let buf1 = Buffer.from("123");
console.log(Buffer.byteLength(buf1));   // 3

【注意】: 一个汉字占用三个字节

let buf2 = Buffer.from("字节");
console.log(Buffer.byteLength(buf2));   // 6

因为Buffer对象的本质是数组, 也可以用数组的length属性获取Buffer实际字节长度
用这种方法比Buffer.byteLength方便

let buf1 = Buffer.from("123");
console.log(buf1.length);   // 3
let buf2 = Buffer.from("字节");
console.log(buf2.length);   // 6

Buffer.concat(list[, totalLength])  合并 list 中所有 Buffer 实例

let buf1 = Buffer.from("abc");
let buf2 = Buffer.from("123");
let buf3 = Buffer.from("def");
let res = Buffer.concat([buf1, buf2, buf3]);
console.log(res);   // <Buffer 61 62 63 31 32 33 64 65 66>
console.log(res.toString());    // abc123def
上一篇下一篇

猜你喜欢

热点阅读