Hi I’m Shendi
Nodejs的字节操作(Buffer)
字节操作是一个编程语言中必不可少的,而在NodeJs中也可以很方便的进行字节操作。
Buffer类
在 js 中没有二进制数据类型,但在一些情况下必须使用到二进制数据类型,比如网络通信,文件读取,加密解密…
因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
当然,在js中有 ArrayBuffer、Uint8Array可以实现类似的效果,但不是很简便,在NodeJS中以Buffer为主
在 6.0 之前直接使用 new 的方式创建Buffer,后面都通过 Buffer.from。
下面介绍常用的基本操作
Buffer.from 将对象转字节数组
通过 Buffer.from
可以将字符串、ArrayBuffer等转Buffer
示例如下
// 字符串默认编码是utf8编码
Buffer.from("Shendi");
// 也可以指定编码
Buffer.from("ShendiUtf-8", "utf8");
// 直接创建字节数组,相当于Java的 new byte[] {1, 2};
Buffer.from([1, 2]);
获取指定字节
Buffer可以理解为一个字节数组,可以直接按照数组的方式来操作
var buf = Buffer.from("Shendi");
console.log(buf.length);
console.log(buf[0]);
效果如下
字节数组转字符串
通过 toString 来直接将字节数组转字符串
var buf = Buffer.from("Shendi");
console.log(buf.toString());
效果如下
分割字节数组
操作时,分割字节数组是很常见的操作,类似于字符串的 substring
,在Buffer中也有对应的方法,使用方式也和 substring
一致
var buf = Buffer.from([1,2,3,4,5,6,7]);
console.log(buf.subarray(0, 2));
console.log(buf.subarray(3));
效果如下
连接字节数组
将多个字节数组连接起来,成为一个数组,使用 Buffer.concat
,函数接收一个数组参数,示例如下
var buf1 = Buffer.from([1,2]);
var buf2 = Buffer.from([3,4]);
console.log(Buffer.concat([buf1, buf2]));
效果如下
实例:加密解密数据
这里使用一个简单的盐值加密来做示例
var encrypt = {
pwd : Buffer.from("Shendi Distributed"),
encode(data) {
var cData = [data.length];
for (var i = 0; i < data.length; i++) {
cData[i] = data[i] ^ encrypt.pwd[i % encrypt.pwd.length];
}
return Buffer.from(cData);
},
decode(data) {
return encrypt.encode(data);
}
};
var edata = encrypt.encode(Buffer.from("砷碲博客"));
var ddata = encrypt.decode(edata);
console.log("加密数据:", edata);
console.log("解密数据:", ddata.toString());
效果如下
END