内容: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. <机器学习实战>读书笔记--k邻近算法KNN

    k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...

  2. 响应式下的雪碧图解决方案 - 活用background-size / background-position

    一.概述 在传统的居中布局时,我们常用background-position这个属性来进行雪碧图的定位,在减少数据量的同时,保证准确定位.在移动端使用越来越重的现在,以往的传统定位,已经无法达到目的, ...

  3. Netty(1):第一个netty程序

    为什么选择Netty netty是业界最流行的NIO框架之一,它的健壮型,功能,性能,可定制性和可扩展性都是首屈一指的,Hadoop的RPC框架Avro就使用了netty作为底层的通信框架,此外net ...

  4. 解决eclipse为什么不能查看源码

    Java eclipse中查看源代码ctrl+左键单击 一.你是第一次使用该功能,没有导入项目源码,故无法查看源码 解决方法: ​1.点 “window“-> “Preferences”-> ...

  5. word转pdf(使用office)

    1.安装office软件 2.在vs中写代码 注意需要引入 Microsoft.Office.Interop.Word插件 /// <summary> /// 将word转换成pdf文件 ...

  6. qq iOS环境配置及调用

    1.下载官方iOS sdk:地址:相关文档 2. 将iOS SDK中的TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle文件拷贝到应用开 ...

  7. 深入理解Java线程池:ScheduledThreadPoolExecutor

    介绍 自JDK1.5开始,JDK提供了ScheduledThreadPoolExecutor类来支持周期性任务的调度.在这之前的实现需要依靠Timer和TimerTask或者其它第三方工具来完成.但T ...

  8. 11、Map、可变参数、Collections

    Map接口 Map集合概述 *A:Map集合概述: 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同 a:Collection中的集合,元素 ...

  9. netty源代码编译_mac os

    工作中会用到netty,有随手整理笔记的习惯,故学习整理下,之前看过了理论知识,接下来就看下源码了,先来编译下 个人 fork git:https://github.com/ending06/nett ...

  10. IO实战-RandomAccessFile在本地实现伪断点续传

    准备:在磁盘中 准备一个目录文件 实现:将该文件复制到目标路径中,关掉程序,再重新打开可以在原位置继续复制. 需求如下: 过程中显示文件的拷贝的百分比 复制过程中关掉程序. 重新启动该程序时,若上次没 ...