Appearance
Buffer
一、global.Buffer
1 概念
Buffer 用于 node 处理二进制数据的,前端没有所谓的二进制格式的数据,只有字符,而且前端的 blob 对象不能修改
node 就自己发明了一个 buffer(用于存储二进制格式的类型)
二进制比较长 buffer 的展现形式是 16 进制的
进制之间是有转化 2,8,16(本身是不会变的)
二进制,一个字节是由 8 个位 bit 组成 1,0
0o 开头是 8 进制
0b 开头是 2 进制
0x 开头是 16 进制
js
// 二进制转10进制
console.log(parseInt("1010", 2));
// 任意进制转任意进制
console.log((0b1010).toString(10));2 一道题
0.1 + 0.2 != 0.3
小数转化二进制后精度会出现无限循环,导致最终结果大于 0.3
js
2 》 10 乘权求和
10 》 其他 反向取余
小数 》 二进制 乘二取整法
0.1 * 2 = 0.2 -> 0
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 0.6 -> 1
0.6 * 2 = 0.2 -> 13 base64 编码
- base64 组成:
英文26个小写,26个大写,0-9的10个数字,+/一共 64 个 - node 中一个汉字三个字节
js
console.log(Buffer.from("帅")); // 0xe5 0xb8 0x85
// 变成二进制 在拆分成 一个个的 字节不大于64的 去取对应的编码
console.log((0xe5).toString(2)); // 11100101
console.log((0xb8).toString(2)); // 10111000
console.log((0x85).toString(2)); // 10000101
// 三个字节-每个8位
// 255 255 255
// 11100101 10111000 10000101
// 拆分为6位,用四个字节表示,不够补0
// 111001 011011 100010 000101
// 00111001 00011011 00100010 00000101
console.log((0b00111001).toString()); // 57
console.log((0b00011011).toString()); // 27
console.log((0b00100010).toString()); // 34
console.log((0b00000101).toString()); // 5
// 57 27 34 5
let str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
str += str.toLowerCase();
str += "0123456789";
str += "+/";
console.log(str[57] + str[27] + str[34] + str[5]);
// 5bif > base64编码
// 一个汉字是3个字节 转换成base64之后会比之前大1/3。
// 如果是比较大的内容 不适合base64编码4 声明方式
js
// buffer 的声明方式 (声明内存的,声明出来的结果是引用类型的)
// 大小代表的是内存大小,再声明的过程中需要给定长度
// node中操作文件的单位是字节,不是位
console.log(Buffer.alloc(3));
// 将内容直接转化为二进制存放
console.log(Buffer.from("中文"));
// toString方法 将二进制转化为其他格式
console.log(Buffer.from("中文").toString());5 拼接
js
// Buffer拼接:声明一个更到的
let b1 = Buffer.from("你好");
let b2 = Buffer.from("世界");
let b3 = Buffer.alloc(12);
b1.copy(b3, 0, 0, 6);
b2.copy(b3, 6, 0, 6);
console.log(b3.toString());
// 自定义
Buffer.prototype.copy = function (
target,
targetStart,
sourceStart = 0,
sourceEnd = this.length
) {
for (let i = 0; i < sourceEnd - sourceStart; i++) {
target[targetStart + i] = this[sourceStart + i];
}
};
Buffer.prototype.contact = function (
list,
len = list.reduce((memo, current) => (memo += current.length), 0)
) {
const buf = Buffer.alloc(len);
let offset = 0;
list.forEach((element) => {
b.copy(buf, offset);
offset += b.length;
});
return buf;
};
let b3 = Buffer.contact([b1, b2, b1]);
console.log(b3.toString());常用方法
- contact()
- toString()
- slice()
- isBuffer()