前置知识
字节
- 一个字节等于8位
- 字节是计算机中传输信息的基本单位
- 一个字节可以表示的最大十进制数是255
- 每个位只能填0或1
进制
- 0b二进制
- 0x十六进制
- 0o八进制
进制之间的转换
- parseInt(‘11’, 2) // 二进制转为十进制
- parseInt(‘77’, 8) // 八进制转为十进制
- parseInt(‘ff’, 16) // 十六进制转为十进制
- (1).toString(2) // 十进制转为二进制
- 1…toString(16) // 十进制转为十六进制
- 1…toString(32) // 十进制转为三十二进制
buffer
- 一个用来存放二进制的缓冲区
- 使用buffer可以对二进制数据和字符串之间进行方便的转化
定义buffer的三种方式
// Buffer内部是操作二进制,但是表现形式是16进制
// 通过长度定义buffer
let buf11 = Buffer.alloc(10) // 创建一个长度为10个字节,用0x0填充的buffer
let buf12 = Buffer.alloc(10, 1) // 创建一个长度为10个字节,用0x1填充的buffer
let buf13 = Buffer.allocUnsafe(10) // 创建一个长度为10个字节,没有初始化的buffer
console.log(buf11) // <Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(buf12) //<Buffer 01 01 01 01 01 01 01 01 01 01>
console.log(buf13) //<Buffer 00 00 00 00 00 00 00 00 e0 f4>
// 通过数组定义buffer
let x = Buffer.from([1, 2, 3])
console.log(x) // [0x1,0x2,0x3]
// 字符串创建
let x = Buffer.from('你好')
// nodejs中不支持gbk编码,采用gbk编码的时候,一个汉字是2个字节,但是nodejs采用utf8编码时,一个汉字占用3个字节
console.log(x) //<Buffer e4 bd a0 e5 a5 bd>
buffer的常用属性和方法
- indexOf
找出buffer中出现的位置
let buf = Buffer.from(‘你好啊小明’)
console.log(buf.indexOf(‘好’)) // 3 ,字节位置
- slice
截取之后修改,会影响源buffer,因为截取出来的内存地址,引用类型
let buf = Buffer.from(‘你好啊小明’)
console.log(buf.slice(0, 3).toString()) // 你
- copy
buf的拷贝
// 实现copy,copy方法一般用的不多,因为要自己去计算alloc需要分配的>字节空间 Buffer.prototype.copy = function (targetBuffer, targetStart = 0, sourceStart >= 0, sourceEnd = this.length) { for (let i = sourceStart; i < sourceEnd; i++) { targetBuffer[targetStart++] = this[i]; } }
- concat
把两个buf进行拼接,该方法相比于copy方法的优势是不需要手动指定内存大小
属于类上的一个静态方法let buf = Buffer.from('你好啊小明') let buf2 = Buffer.from('小红') console.log(Buffer.concat([buf, buf2]).toString()) // 你好啊小明小红
// 源码实现
Buffer.concat = function (bufferList, length) { if (typeof length === 'undefined') { length = 0; bufferList.forEach(buffer => { length += buffer.length; }); } let buf = Buffer.alloc(length); let offset = 0; bufferList.forEach(buffer => { buffer.copy(buf, offset); offset += buffer.length; }); return buf; }
- length
获取buffer的字节长度
- isBuffer
判断是不是buffer类型
let buf = Buffer.from(‘你好啊小明’)
console.log(Buffer.isBuffer(buf)) // true
- toString
把二进制转为字符串文本
- alloc
分配内存空间并初始化
- from
定义buffer
自定义split方法
- 根据指定的分隔符进行分割buffer
Buffer.prototype.split = function (sep) {
let arr = [];
let offset = 0; // 偏移量
let current = 0; // 当前指向哪个位置
let sepLength = Buffer.from(sep).length;
while ((-1 !== (current = this.indexOf(sep, offset)))) {
arr.push(this.slice(offset, current));
offset = current + sepLength;
}
arr.push(this.slice(offset));
return arr;
}
let buf = Buffer.from('你好啊小明小红');
console.log(buf.split('小').toString()) // 你好啊,明,红