buffer
1. buffer发展
- ASCII(127个字符,只有数字,字母)
- GBK2312->GBK->GBK18030
- Unicode
- UTF-8
一个字符有 8
个 位
, gbk
中汉字由 2
个字节组成, utf-8
中汉字由 3
个字节组成
2. 进制转化
- parseInt:
任意
进制转化为10
进制 - toString:
任意
进制转化为任意
进制
//任意进制转为十进制
console.log(parseInt('111', 2)); //=>7
console.log(parseInt('17', 8)); //=>15
console.log(parseInt('1f', 16)); //=>31
//任意进制转化为任意进制
console.log((7).toString(2)); //=>111
console.log((15).toString(8)); //=>17
console.log((31).toString(16)); //=>1f
3. iconv-lite
node中不支持gbk, 将gbk转为uft-8用 iconv-lite
const iconv = require('iconv-lite');
const fs = require('fs');
const path = require('path');
function readFile(fileName) {
let code = fs.readFileSync(path.resolve(__dirname, fileName));
console.log(code);
//用iconv-lite转化
code = iconv.decode(code, 'gbk');
console.log(code); //=>你好
}
readFile('./a.txt')
4. 定义buffer的三种方式
- Buffer.alloc()
- Buffer.from(’’)
- Buffer.from([])
const b1 = Buffer.alloc(8);
const b2 = Buffer.from('张');
const b3 = Buffer.from(['张', '王', '李', '赵']);
5. buffer中常用方法
- buf.toString()
- buf.slice()
- buf.copy()
- buf.indexOf()
- Buffer.concat()
- Buffer.isBuffer()
5.1 buf.toString([encoding[, start[, end]]])
let buffer = Buffer.from('张三');
console.log(buffer.toString('utf-8', 0, 3)); //=>张
5.2 buf.slice([start[, end]])
buffer截取
let b1=Buffer.from('张三');
const b2=b1.slice(0, 3);
console.log(b2.toString()); //=>张
5.3 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
buffer拷贝
const b1=Buffer.from('张三');
const b2=Buffer.alloc(6);
b1.copy(b2,0,0,3);
b1.copy(b2,3,3,6);
console.log(b2.toString());//=>张三
实现
Buffer.prototype.copy = function(target, targetStart, sourceStart, sourceEnd) {
for (let i = sourceStart; i < sourceEnd; i++) {
target[targetStart++] = this[i];
}
}
5.4 Buffer.concat(list[, totalLength])
buffer拼接
const b1 = Buffer.from('张');
const b2 = Buffer.from('三');
const b3 = Buffer.concat([b1, b2]);
console.log(b3.toString()); //=>张三
实现
Buffer.concat = function(list) {
if (list.length === 0) return list[0];
const totalLen = list.reduce((memo, item) => memo + item.length, 0);
const buffer = Buffer.alloc(totalLen);
let index = 0;
for (let i = 0; i < list.length; i++) {
const buf = list[i];
for (const byte of buf) {
buffer[index++] = byte;
}
}
return buffer;
}
5.5 Buffer.isBuffer
怕断是否是Buffer
const b1 = Buffer.from('张');
console.log(Buffer.isBuffer(b1)); //=>true
5.6 buf.length
字符的长度
const b1 = Buffer.from('张三');
console.log(b1.length); //=>6
5.7 buf.indexOf
const b1 = Buffer.from('张三');
console.log(b1.indexOf('三')); //=>3
5.8 实现一个split
//实现逻辑为 indexOf+slice
Buffer.prototype.split = function(sep) {
//获取分隔符的字符长度
const len = Buffer.from(sep).length;
//当前位置
let current = 0;
//当前偏移
let offset = 0;
//存储数据
const arr = [];
while ((current = this.indexOf(sep, offset)) !== -1) {
arr.push(this.slice(offset, current))
offset = current + len;
}
//最后一段
arr.push(this.slice(offset));
return arr;
}
base64
- base64编码没有加密功能
- base64转化后的结果会比以前大1/3
- 不是所有图片都能转化成base64
模拟过程
const b1 = Buffer.from('张'); //=>e5 bc a0
//转化为2进制
console.log((0xe5).toString(2)); //=>11100101
console.log((0xbc).toString(2)); //=>10111100
console.log((0xa0).toString(2)); //=>10100000
//base64是4*6,及将3*8->4*6
//11100101 10111100 10100000->111001 011011 110010 100000
//转化为10进制
console.log(parseInt(0b00111001)); //=>57
console.log(parseInt(0b00011011)); //=>27
console.log(parseInt(0b00110010)); //=>50
console.log(parseInt(0b00100000)); //=>32
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
str += str.toLowerCase();
str += '0123456789+/';
console.log(str[57] + str[27] + str[50] + str[32]); //=>5byg=>对应的就是 张