内容:Buffer与字符编码,Buffer创建、写入、读取、转换成JSON对象、合并、比较、拷贝、裁剪、长度

Buffer 与字符编码
Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

const buf = Buffer.from('runoob', 'ascii');
// 输出 72756e6f6f62
console.log(buf.toString('hex'));
// 输出 cnVub29i
console.log(buf.toString('base64'));

##############################################################################################
创建 Buffer 类
Buffer 提供了以下 API 来创建 Buffer 类:
    • Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
    • Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
    • Buffer.allocUnsafeSlow(size)
    • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
    • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
    • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
    • Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例

// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');

############################################################################################
写入缓冲区
###语法
写入 Node 缓冲区的语法如下所示:
buf.write(string[, offset[, length]][, encoding])
###参数
参数描述如下:
    • string - 写入缓冲区的字符串。
    • offset - 缓冲区开始写入的索引值,默认为 0 。
    • length - 写入的字节数,默认为 buffer.length
    • encoding - 使用的编码。默认为 'utf8' 。
根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入。
###返回值
返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。
###实例

buf = Buffer.alloc(256);
len = buf.write("love A");
console.log("写入字节数 : "+ len);

执行以上代码,输出结果为:
写入字节数 : 14

#############################################################################################
从缓冲区读取数据
###语法
读取 Node 缓冲区数据的语法如下所示:
buf.toString([encoding[, start[, end]]])
###参数
参数描述如下:
    • encoding - 使用的编码。默认为 'utf8' 。
    • start - 指定开始读取的索引位置,默认为 0。
    • end - 结束位置,默认为缓冲区的末尾。
###返回值
解码缓冲区数据并使用指定的编码返回字符串。
###实例

buf = Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
buf[i] = i + 97;
}
console.log( buf.toString('ascii')); // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5)); // 输出: abcde
console.log( buf.toString('utf8',0,5)); // 输出: abcde
console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde

执行以上代码,输出结果为:
abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

#############################################################################################
将 Buffer 转换为 JSON 对象
###语法
将 Node Buffer 转换为 JSON 对象的函数语法格式如下:
buf.toJSON()
当字符串化一个 Buffer 实例时,JSON.stringify() 会隐式地调用该 toJSON()。
###返回值
返回 JSON 对象。
##实例

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);
console.log(buf);
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);
const copy = JSON.parse(json, (key, value) => {
return value && value.type === 'Buffer' ? Buffer.from(value.data) : value;
});
// 输出: <Buffer 01 02 03 04 05>
console.log(copy);

执行以上代码,输出结果为:
<Buffer 01 02 03 04 05>
{"type":"Buffer","data":[1,2,3,4,5]}
<Buffer 01 02 03 04 05>

##############################################################################################
缓冲区合并
###语法
Node 缓冲区合并的语法如下所示:
Buffer.concat(list[, totalLength])
###参数
参数描述如下:
    • list - 用于合并的 Buffer 对象数组列表。
    • totalLength - 指定合并后Buffer对象的总长度。
###返回值
返回一个多个成员合并的新 Buffer 对象。
###实例

var buffer1 = Buffer.from(('Love'));
var buffer2 = Buffer.from(('A'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString());

执行以上代码,输出结果为:
buffer3 内容: Love A

##############################################################################################
缓冲区比较
###语法
buf.compare(otherBuffer);
###参数
    • otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象。
###返回值
返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。
###实例

var buf1 = Buffer.from('zabc');
var buf2 = Buffer.from('xq');
var result = buf1.compare(buf2); if(result < 0){
console.log(buf1.toString()+'在'+buf2.toString()+'之前');
}else if (result === 0){
console.log(buf1.toString()+'与'+buf2.toString()+'相同');
}else {
console.log(buf1.toString()+'在'+buf2.toString()+'之后');
}

执行以上代码,输出结果为:
zabc在xq之后

##########################################################################################
拷贝缓冲区
###语法
Node 缓冲区拷贝语法如下所示:
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
###参数
参数描述如下:
    • targetBuffer - 要拷贝的 Buffer 对象。
    • targetStart - 数字, 可选, 默认: 0
    • sourceStart - 数字, 可选, 默认: 0
    • sourceEnd - 数字, 可选, 默认: buffer.length
###返回值
没有返回值。
###实例

var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
//将 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);
console.log(buf1.toString());

执行以上代码,输出结果为:
abRUNOOBijkl

###########################################################################################
缓冲区裁剪
Node 缓冲区裁剪语法如下所示:
buf.slice([start[, end]])
###参数
    • start - 数字, 可选, 默认: 0
    • end - 数字, 可选, 默认: buffer.length
###返回值
返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。
###实例

var buffer1 = Buffer.from('runoob');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());

执行以上代码,输出结果为:
buffer2 content: ru

##########################################################################################
缓冲区长度
语法
Node 缓冲区长度计算语法如下所示:
buf.length;
返回值
返回 Buffer 对象所占据的内存长度。
实例

var buffer = Buffer.from('www.XXXXXXX.com');
// 缓冲区长度
console.log("buffer length: " + buffer.length);

8、Node.js Buffer(缓冲区)的更多相关文章

  1. Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  2. Node.js Buffer

    Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer ...

  3. Node.js——Buffer

    介绍 JavaScript没有读取和操作二进制数据流的机制,但是 node.js 引入了Buffer 类型,可以操作TCP流或者文件流 使用Buffer可以用来对临时数据(二进制数据)进行存储,当我们 ...

  4. 23. Node.Js Buffer类(缓冲区)-(三)文件读取实例

    转自:https://blog.csdn.net/u011127019/article/details/52513109

  5. 22. Node.Js Buffer类(缓冲区)-(二)

    转自:https://blog.csdn.net/u011127019/article/details/52512242

  6. 21. Node.Js Buffer类(缓冲区)-(一)

    转自:https://blog.csdn.net/u011127019/article/details/52512242

  7. node.js—Buffer类(二进制数据处理模块)

    Buffer类概述 一个用于更好的操作二进制数据的类 我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流 Node为我们提供了一个更加方便的去操作这种数据流的类 Buffer,他是一个全局的 ...

  8. Node.js:Buffer

    ylbtech-Node.js:Buffer 1.返回顶部 1. Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文 ...

  9. Node.js缓存

    Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 ...

随机推荐

  1. 和为S的连续正数序列★★

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  2. CADisplayLink+弹簧动画实现果冻效果

    项目中在Tabbar中间的按钮要从底部弹出视图并有果冻效果,在CocoaChina中找了一篇博客用 UIBezierPath 实现果冻效果,github,自己就按着上面的demo修改了一下( 之前也是 ...

  3. [转]OData and Authentication – Part 5 – Custom HttpModules

    本文转自:https://blogs.msdn.microsoft.com/odatateam/2010/07/19/odata-and-authentication-part-5-custom-ht ...

  4. 在使用HttpClient做客户端调用一个API时 模拟并发调用时发生“死锁"?

    平时还是比较喜欢看书的..但有时候遇到问题还是经常感到脑袋一蒙..智商果然是硬伤.. 同事发现了个问题,代码如下: class Program { static void Main(string[] ...

  5. Java学习--Java 中的包装类

    Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简 ...

  6. Java基础教程(3)--回顾HelloWorld

      在上一篇文章中,我们已经编写了第一个Java程序--HelloWorld,并且对它进行了编译和运行.虽然这个例子很短小,但是它具有一个完整的Java程序所应该具有的结构.在这篇文章中,我将会对这个 ...

  7. 最大子序列和问题--时间复杂度O(NlogN)

    最大子序列和问题--时间复杂度O(NlogN) package a; /* * 最大子序列和问题,时间复杂度O(NlogN) */ public class Sequence { private st ...

  8. HTML——基本html标签

    基本html标签 <html> ... </html>  定义HTML文档 <head> ... </head>  文档的信息 <meta /&g ...

  9. [SCOI2009]粉刷匠

    线性DP预处理+分组背包 首先设dp[i][j][0/1]表示该木板前i个格刷了j次且最后一次颜色为0/1的最大正确数 做下0/1的前缀和然后转移状态 dp[i][j][k]=max(dp[l][j] ...

  10. Luogu 4240:毒瘤之神的考验

    传送门 Sol 分开考虑 \(\varphi(ij)\) 中 \(ij\) 的质因子 那么 \[\varphi(ij)=\frac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...