node之buffer

本文详细介绍了Node.js中的Buffer类,包括字节、进制转换、Buffer的创建方式、常用属性和方法,如indexOf、slice、copy、concat、length、isBuffer及toString等。还展示了自定义split方法的实现,以及Buffer在字符串与二进制数据转换中的作用。
摘要由CSDN通过智能技术生成

前置知识

字节

  1. 一个字节等于8位
  2. 字节是计算机中传输信息的基本单位
  3. 一个字节可以表示的最大十进制数是255
  4. 每个位只能填0或1

进制

  1. 0b二进制
  2. 0x十六进制
  3. 0o八进制

进制之间的转换

  1. parseInt(‘11’, 2) // 二进制转为十进制
  2. parseInt(‘77’, 8) // 八进制转为十进制
  3. parseInt(‘ff’, 16) // 十六进制转为十进制
  4. (1).toString(2) // 十进制转为二进制
  5. 1…toString(16) // 十进制转为十六进制
  6. 1…toString(32) // 十进制转为三十二进制

buffer

  1. 一个用来存放二进制的缓冲区
  2. 使用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的常用属性和方法

  1. indexOf

找出buffer中出现的位置
let buf = Buffer.from(‘你好啊小明’)
console.log(buf.indexOf(‘好’)) // 3 ,字节位置

  1. slice

截取之后修改,会影响源buffer,因为截取出来的内存地址,引用类型
let buf = Buffer.from(‘你好啊小明’)
console.log(buf.slice(0, 3).toString()) // 你

  1. 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];
 }
}
  1. 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;
}
  1. length

获取buffer的字节长度

  1. isBuffer

判断是不是buffer类型
let buf = Buffer.from(‘你好啊小明’)
console.log(Buffer.isBuffer(buf)) // true

  1. toString

把二进制转为字符串文本

  1. alloc

分配内存空间并初始化

  1. from

定义buffer

自定义split方法

  1. 根据指定的分隔符进行分割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()) // 你好啊,明,红
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值