JavaScript善于处理字符串,但是由于它最初是被设计用来处理HTML文档的,因此它并不善于处理二进制数据。因为JavaScript中没有字节类型,也没有结构化类型,甚至没有字节数组类型,只有数值类型和字符串类型。
为了使处理二进制数据任务变得简单,Node引入了一个二进制缓冲区,以buffer伪类中的JavaScript API形式暴露给外界。缓冲区的长度以字节为单位,并且可以随时设置和获取缓冲区中的内容。
创建缓冲区
var buf = new Buffer("hello world")
默认是以UTF-8编码格式创建的缓冲区,想要指定编码格式的话,可以定义构造函数的第二个参数,例如:用base64编码格式创建缓冲区
var buf = new Buffer("8b76fde713ce","base64")
如果缓冲区没有具体内容初始化,则可以通过指定容量大小来创建缓冲区,以备容纳数据。
var buf = new Buffer(1024) // 创建长度为1024字节的缓冲区
缓冲区可接受的编码格式
ASCII | 该编码格式适用于ASCII字符集 |
UTF-8 | 这是一种变宽度的编码格式,可以表示Unicode字符集中的任意字符,他是网络上的首选编码格式,也是创建缓冲区默认的编码格式。 |
Base 64 | 这种编码格式基于64个可打印的ASCII字符来表示二进制数据,Base64通常用于在字符文档中内嵌入可以被转换成字符串的二进制数据,在需要时又可以完整无损的转回原来的二进制格式。 |
在缓冲区中获取和设置数据
在创建或者获取到缓冲区之后,想要查看或者修改其内容,那么可以使用 "[ ]"操作符来访问缓冲区中的某个字节。
var buf = new Buffer("hellow world")
console.log(buf[1]) // 101 获取缓冲区中的第一个字节
buf[2] = 200 // 将第二个位置上的数据设置为200
还可以缓冲区的长度去迭代缓冲区内容,来设置或者获取每个字节
var buf = new Buffer(10) // 创建一个长度为10的缓冲区,此时缓冲区中没有任何数据
console.log(buf.length) // 10
// 遍历给缓冲区每个字节赋值
for (let i = 0; i < buf.length; i++) {
buf[i] = i
}
注意:
- 如果缓冲区中的某个位置设置为一个大于255的数,那么将会使用256对改数据取模,最终将取模结果赋值给该位置;
- 如果缓冲区中某个位置设置为256,那么该位置实际上被赋值为0;
- 如果缓冲区某个位置设置为5.2这样的小数,那么该位置仅会存储整数部分;
- 如果尝试给超出缓冲区便捷的位置赋值,那么赋值操作会以失败告终,缓冲区也不会发生变化。
切分缓冲区
可以使用copy方法将缓冲区的一部分复制到另一个缓冲区中
var buf1 = new Buffer("hello world")
var buf2 = new Buffer(5)
const targetStart = 0
const sourceStart = 0
const sourceEnd = 5
buf1.copy(buf2, targetStart, sourceStart, sourceEnd)
console.log(buf2) // hello
copy方法参数
buf.copy(target, targetStart, sourceStart, sourceEnd)
参数 | 描述 |
target | 必填,复制的目标缓冲区 |
targetStart | 非必填,Number类型,指定开始复制的位置,默认0 |
sourceStart | 非必填,Number类型,指定从哪里开始复制,默认0 |
sourceEnd | 非必填,Number类型,指定从哪里停止复制,默认缓冲区的结尾位置。 |
缓冲区解码
缓冲区解码就是将缓冲区的数据转换为一个其他格式的数据,默认不规定编码格式时,会默认转换为UTF-8编码格式。例如:将一个缓冲区转换成Base64编码格式的字符串。
var base64Str = buf.toString("base64")
还可以使用toString方法,将UTF-8格式的字符串转换为base64格式的字符串
var utf8String = "my string"
var buf - new Buffer(utf8String)
var base64String = buf.toString("base64")
console.log(base64String) // bXkgc3RyaW5n