NodeJs 之Buffer(缓冲区)

前言

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据。

来认识一下 Buffer , 例举几种常见的创建 Buffer 类 , 更多请查看官方文档

//使用new Buffer(size)方式创建一个Buffer实例:
var buf = new Buffer(10);
console.log("buf: ", buf);

//使用new Buffer(array)方式创建一个Buffer实例:
var buf2 = new Buffer(['runoob', 'ascii']);
console.log("buf2: ", buf2);

//使用new Buffer(str[,encoding])方式创建一个Buffer实例:
var buf3 = new Buffer('hisen', 'utf-8');
console.log('buf3: ', buf3)

输出结果

PS C:\HiSen\myWorkDemo\node_demo> node buffer.js
buf:  <Buffer 00 00 00 00 00 00 00 00 00 00>
buf2:  <Buffer 00 00>
buf3:  <Buffer 68 69 73 65 6e>
PS C:\HiSen\myWorkDemo\node_demo>

结论:
一个Buffer对象的大小,在创建时就固定下来,创建之后不可改变

Buffer 常用方法

write 写入 Node 缓冲区

buf.write(string[, offset[, length]][, encoding])

参数:
string - 写入缓冲区的字符串。
offset- 缓冲区开始写入的索引值,默认为 0 。
length - 写入的字节数,默认为 buffer.length
encoding - 使用的编码。默认为 ‘utf8’ 。

// 写入缓冲区
var buf5 = Buffer.alloc(123);
len = buf5.write("https://blog.csdn.net/HiSen_CSDN");

console.log("写入字节数 : " + len); // 写入字节 32
console.log(buf5) // <Buffer 68 74 74 70 73 3a 2f 2f 62 6c 6f 67 2e 63 73 64 6e 2e 6e 65 74 2f 48 69 53 65 6e 5f 43 53 44 4e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >

根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入。

toString() 读取Node 缓冲区

buf.toString([encoding[, start[, end]]])

解码缓冲区数据并使用指定的编码返回字符串 。

参数:
encoding - 使用的编码。默认为 ‘utf8’ 。
start - 指定开始读取的索引位置,默认为 0。
end - 结束位置,默认为缓冲区的末尾。

// buffer 字符串编码,转换不同格式
const buf4 = Buffer.from('Hisen', 'ascii');
console.log(buf4.toString('hex'));  // 输出 486973656e
console.log(buf4.toString('base64')); // 输出 SGlzZW4=

当然了,现在Js有一个 atob || btoa 的方式来进行 base64 和 二进制的转换。也是很方便的。

NodeJs 目前支持的字符串编码

ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
ucs2 - utf16le 的别名。
base64 - Base64 编码。
latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式。
binary - latin1 的别名。
hex - 将每个字节编码为两个十六进制字符。

其实 Buffer 类还有格式转换,合并,比较,拷贝,等功能,这里呢也不做多余的样例,其实我个人感觉应用场景可能就是 :操作二进制数据流,数据格式转换。哈哈哈 ~ 后续有更深的理解了,再补录。各位童鞋见谅哈。

发布了20 篇原创文章 · 获赞 40 · 访问量 5870

猜你喜欢

转载自blog.csdn.net/HiSen_CSDN/article/details/103484711