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
网友评论