Node.js学习二 —— 缓冲区

23 篇文章 0 订阅

缓冲区

利用缓冲区处理、编码、解码二进制数据

创建缓冲区

使用字符串创建:

var buf = new Buffer('Hello World');

如果需要指定编码格式,则添加第二个参数如base64表明即可。

可以被接受的编码格式(注意大小写下不同的写法):

  • ascii——ASCII:该编码格式仅适用于ASCI字符集。
  • utf8——UTF-8:这是一种变宽度的编码格式,可以表示Unicode字符集中的任意字符,它是网络上的首选编码格式。在你没有指定编码格式参数的情况下,8是默认的编码格式。
  • base64——Base64:这种编码格式基于64个可打印的ASCI字符来表示二进制数据, Bse64通常用于在字符文档内嵌入可以被转换成字符串的二进制数据,在需要时又可以完整无损地转换回原来的二进制格式。

如果没有初始化内容,可以指定大小:

var buf = new Buffer(1024); // 创建长度为1024个字节的缓冲区

在缓冲区中获取和设置数据

创建之后,可以查看和修改:

var buf = new Buffer("my buffer content");
// 像数组一样读取
console.log(buf[10]);
// 同样也可以修改
buf[5] = 123;

注意,当创建一个用长度初始化的缓冲区时,里面默认的数据并不是0,而是一些随机值

注意:在某些情况下不会出错。如:

  1. 如果将缓冲区中的某个位置设置为一个大于255的数,那么将会用256对该数取模,最终将取模结果赋给该位置。
  2. 如果将缓冲区中某个位置设置为256,那么该位置实际上是被赋值为0。
  3. 如果将缓冲区中某个位置设置成100.7这样的小数,那么该位置仅会存储整数部分,本例中存储的是100
  4. 如果尝试给超出缓冲区边界的位置赋值,那么赋值操作将以失败告终,缓冲区也不会发生变化

除了修改和查看,还可以获取缓冲区长度:

const length = buf.length;

切分缓冲区

可以通过指定开始和结束位置来从一个长缓冲区中划分区域,从而创建一个小的缓冲区。

// 使用缓冲对象上的slice方法,第一个参数为开始索引,第二个参数为结束索引
var smallerBuffer = buf.slice(8,15);
console.log(smallerBuffer.toString()); // 可以用toString查看

但是!slice创建小的缓冲区,并没有进行复制、分配新的内存,而是引用了父缓冲区中的内存,也就是只是保存了原来的地址,只是初始化了小缓冲区的头尾指针。所以有下面一些问题:

  1. 父缓冲区被修改,如果涉及子缓冲区的数据,同样也会被修改。
  2. 父缓冲区创建子缓冲区,之后如果成为内存垃圾,也不会被垃圾回收机制回收,有内存泄露。
  3. 那怎么办呢?看下一点。

复制缓冲区

可以使用copy方法,将一个缓冲区的一部分复制到另一个缓冲区中:

const buf1 = new Buffer("this is the content of first buffer");
let buf2 = new Buffer(11);

/**
 * 参数分别为:
 * 1. 目标缓冲区
 * 2. 复制后,从目标中的哪个位置开始放置
 * 3. 被复制缓冲区中,复制开始的索引
 * 4. 被复制缓冲区中,复制结束的索引
 */
buf1.copy(buf2,0,8,19); // buf2的内容 => the content

缓冲区解码

缓冲区可以转换成UTF-8格式的字符串。

var str = buf.toString();

如果给toString()传参,可以指定解码的编码格式。

const str = buf.toString('base64');

小结

  1. 有时候不得不对二进制数据进行处理,但是原生JS并没有明确提供处理方法。
  2. Node的Buffer类对内存操作进行了封装,可以处理二进制。
  3. 二进制和字符串可以互相转换。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧州刺史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值