利用缓冲区处理、编码、解码二进制数据
使用字符串创建:
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,而是一些随机值
注意:在某些情况下不会出错。如:
- 如果将缓冲区中的某个位置设置为一个大于255的数,那么将会用256对该数取模,最终将取模结果赋给该位置。
- 如果将缓冲区中某个位置设置为256,那么该位置实际上是被赋值为0。
- 如果将缓冲区中某个位置设置成100.7这样的小数,那么该位置仅会存储整数部分,本例中存储的是100
- 如果尝试给超出缓冲区边界的位置赋值,那么赋值操作将以失败告终,缓冲区也不会发生变化
除了修改和查看,还可以获取缓冲区长度:
const length = buf.length;
可以通过指定开始和结束位置来从一个长缓冲区中划分区域,从而创建一个小的缓冲区。
// 使用缓冲对象上的slice方法,第一个参数为开始索引,第二个参数为结束索引
var smallerBuffer = buf.slice(8,15);
console.log(smallerBuffer.toString()); // 可以用toString查看
但是!slice
创建小的缓冲区,并没有进行复制、分配新的内存,而是引用了父缓冲区中的内存,也就是只是保存了原来的地址,只是初始化了小缓冲区的头尾指针。所以有下面一些问题:
可以使用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');