Node.js系列:Buffer类的使用

时间:2021-07-10 00:26:48
客户端JavaScript中没有对二进制数据提供很好的支持。但是在处理TCP流或文件流时,必须要处理二进制数据。Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区。
Buffer中存的数据默认为16进制。
1、创建Buffer对象
在Node.js中,Buffer类是一个可以在任何模块中不使用的全局类,不要单独加载。可以使用New关键字来创建该类的实例对象。
Buffer类有三种形式的构造函数:
第一种:将缓存区大小(以字节为单位)作为构造函数的参数
var size = 128; //缓存区大小单位字节
var buf = new Buffer(size);
此时被创建的Buffer对象有一个length属性,属性值为缓存区大小。
console.log(size); //128
可以使用Buffer对象的fill()函数来初始化缓存区中的所有内容:
buf.fill(value,[offset],[end]);
ps:
value 必须参数,参数值是需要被写入的数值。
[offset] 可选参数,默认为0,用于指定从第几个字节处开始写入被指定的数值
[end] 可选参数,用于指定数值一直写入到第几个字节处,默认值为Buffer对象的最大值
例子:
1、声明缓存区实例,并在第10个字节的位置输入1,直到末尾。
2、在第20~30字节之间,写入2
buf = new Buffer(128);
buf.fill(1,10);
buff.fill(2,20,30);
 
第二种:直接使用一个数组来初始化缓存区。
var buf = new Buffer(Array);
这种形式的构造函数中,使用了一个存放需要被指定数值的数组来作为构造函数的参数。
var arr = [1,2,3];
var buf = new Buffer(arr);
console.log(buf); //
 
第三种:直接使用一个字符串来初始化缓存区。
var str = "你好";
var buf = new Buffer(str,[encoding]);
ps:
str:必须参数,参数值用于初始化缓存区,
[encoding]:可选参数,用于指定字符串文字编码格式,默认为"utf8"
Node.js中可以使用的编码:
ascii : ASCII字符串
utf8 : UTF-8字符串
utf16le : UTF-16LE字符串
usc2 : USC2字符串
base64 : 经过BASE64编码后的字符串
binary : 二进制数据(不推荐使用)
hex : 使用十六进制数值表示的字符串
 
2、字符串的长度与缓存区的长度
Node.js中,一个字符串长度与根据该字符串创建的缓存区的长度并不相同。计算字符串长度时,以文字作为单位;计算缓存区长度时,以字节作为单位。
 
Buffer对象用slice()函数取出指定位置处的数据,该方法的使用与string对象的slice方法相同。slice()函数并不是复制缓存区的数据而是共享数据,因此,一旦修改了slice()函数取出的数据,则缓存区中保存的数据也将被修改。
 
3、Buffer对象与字符串对象之间的相互转换
Buffer 对象的toString方法可以将Buffer对象中保存的数据转换为字符串:
var str = "我喜爱编程";
var buf = new Buffer(str);
buf.toString([encoding],[start],[end]);
[encoding]:指定Buffer对象中保存的文字编码格式,默认值为utf8;
[start]:指定被转换数据的起始位置,以字节为单位
[end]:指定被转换数据的终止位置,以字节为单位
实例:
var str = "我喜爱编程";
var buf = new Buffer(str);
buf.toString("utf8",9,12); //编
buf.toString("utf8",12,buf.length); //程
 
Buffer对象的write方法,用于向已经创建的Buffer对象中写入字符串。
var str = "我喜爱编程";
var buf = new Buffer(str);
buf.write(string,[offset],[length],[encoding]);
string:必须参数,用于指定需要写入的字符串
[offset]:指定字符串转换位字节数据后的写入位置
[length]:指定字符串转换位字节数据后的写入位置
[encoding]:指定写入字符串时使用的编码格式,默认为utf8;
字节数据的书写位置从第1+offset个字节开始,到offset+length为止。
var str = "我喜爱编程";
var buf = new Buffer(str);
buf.write("热",3,3); //3
buf.toString(); //我热爱编程
 
StringDecoder对象,可以将Buffer对象中的数据转换为字符串,该对象的作用与Buffer对象的toString()函数的作用相同,但是对于utf8编码格式的字符串提供更好的支持。在使用StringDecoder对象时,首先需要加载Node.js中的string_decoder模块。
加载模块
varstringDecoder=require("string_decoder").StringDecoder;
实例化对象
var decoder = new StringDecoder([encoding]);
使用该对象的write()函数可以将Buffer对象中的数据转换位字符串
decoder.write(buffer);
 
4、Buffer对象与JSON对象之间的相互转换
Node.js中,可以使用JSON.stringify()方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse()方法将一个经过转换后的字符串还原为一个数组。
var str = "我喜爱编程";
var buf = new Buffer(str);
var json = JSON.stringify(buf);
var parseArr = JSON.parse(json);
var copy = new Buffer(parseArr);
console.log(copy.toString()); //我喜爱编程
 
5、复制缓存数据
当需要将Buffer对象中保存的数据复制到另一个Buffer对象中时,可以使用Buffer对象的copy方法。
var str = "我喜爱编程";
var buf = new Buffer(str);
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd]);
targetBuffer:必选参数,用于指定复制的目标Buffer对象
[targetStart]:可选参数,用于指定从目标Buffer对象中从第几个字节开始写入数据,默认值为0
[sourceStart]:可选参数,指定从复制源Buffer对象中获取数据时的开始位置,默认0
[sourceEnd]:可选参数,指定从复制源Buffer对象中获取数据的结束位置,默认为复制Buffer对象的长度
var buf_a = Buffer("我喜爱编程");
var buf_b = Buffer(128);
buf_b.fill(0);
buf_a.copy(buf_b,10);
 
6、Buffer类的类方法
Node.js为Buffer类定义了三个类方法:
isBuffer(),用于判断一个对象是否为一个Buffer对象
语法:Buffer.isbuffer(obj);obj参数用于指定需要被判断的对象,如果对象为Buffer对象,方法返回true,否则返回false
var a = "aaa";
var b = Buffer(10);
Buffer.isBuffer(a);
Buffer.isBuffer(b);
 
byteLength(),用来计算一个指定字符串的字节数
语法:Buffer.byteLength(string,[encoding]);
string:必须参数,用于指定计算字节数的字符串
[encoding]:可选参数,用于指定按什么编码方式来计算字节数,默认utf8;
 
concat(),将几个Buffer对象结合创建为一个新的Buffer对象。
语法:Buffer.concat(list,[totalLength]);
list:必须参数,参数值为一个存放了多个Buffer对象的数组;
totalLength:可选参数,用于指定被创建的Buffer对象的总长度,当省略该参数时,被创建的Buffer对象为第一个参数数组中所有Buffer对象的长度的合计值。
如果第一个参数为空数组,或第二个参数等于0,那么concat方法返回一个长度为0的Buffer对象。
如果第一个参数数组中只有一个Buffer对象,那么concat方法直接返回该Buffer对象。
如果第一个参数值数值中拥有一个以上的Buffer对象,那么concat方法返回被创建的Buffer对象。
 
isEncoding(),用于检测一个字符串是否为一个有效的编码格式字符串;
语法:Buffer.isEncoding(encoding);
str1 = "utf16le";
Buffer.isEncoding(str1); //true

Node.js系列:Buffer类的使用的更多相关文章

  1. Node.js系列-http

    前言: 最近一直忙着公司项目的事,战友们的留言也没空回复,博客也有段时间没有更新了,年底了就是一个的忙啊~~~(ps:同感的也给个赞吧) 现在前端的就是一直地更新一直有新的东西出来,什么ES2015, ...

  2. Node.js系列-express(上)

    前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...

  3. node.js系列笔记之node.js初识《一》

    node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...

  4. Node&period;js系列——(4)优势及场景

    背景 之前几篇系列文章简单介绍了node.js的安装配置及基本操作: Node.js系列--(1)安装配置与基本使用 Node.js系列--(2)发起get/post请求 Node.js系列--(3) ...

  5. 笔记:Node&period;js 的 Buffer 缓冲区

    笔记:Node.js 的 Buffer 缓冲区 node.js 6.0 之前创建的 Buffer 对象使用 new Buffer() 构造函数来创建对象实例,但权限很大,可以获得敏感信息,所以建议使用 ...

  6. &lbrack;Node&period;js&rsqb; 03 - Buffer&comma; Stream and File IO

    fs 模块,视频教学 os 模块,视频教学,api doc Buffer类 创建 Buffer 类 // 创建一个长度为 10.且用 0 填充的 Buffer. const buf1 = Buffer ...

  7. Node&period;js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  8. Node&period;js学习 - Buffer

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

  9. node&period;js中Buffer缓冲器的使用

    一.什么是Buffer Buffer缓冲器是用来存储输入和输出数据的一段内存.js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了. 所以node.js提供了Buffer类来处理二进 ...

随机推荐

  1. WebService应用一例,带有安全验证

    1.创建WEB项目,添加WEB服务WebService1.asmx,代码如下: using System; using System.Collections.Generic; using System ...

  2. CopyOnWriteArrayList实现原理及源码分析

    CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可 ...

  3. 轮评审用例,写用例的重要性-----(python单元测试反思)

    时间过的真快,3月底了,更新一次博客吧,算是对三月份忙碌的一个总结. 吃过饭,习惯登录qq,看到我群里的一个大神,碎冰发的一个作业 不就是写个代码吗,然后写完再进行测试这个代码是否实现了这个功能. 于 ...

  4. Leetcode&lowbar;260&lowbar;Single Number III

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50276549 Given an array of numb ...

  5. json格式处理及扩展

    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js"></script> < ...

  6. 软件测试1gkd

        通过老师课上的讲解以及对书本和百度百科的学习,我对软件测试有如下的理解.     软件开发的最基本要求是按时.高质量地发布软件产品,而软件测试是软件质量保证的最重要的手段之一.在整个软件生命周 ...

  7. datatables 配套bootstrap样式使用小结(2) ajax篇

    距离上一篇有点时间了,周末做了伴郎参加了一个土豪同学的婚礼. 上一篇是介绍一下基本的用法,基本的原理是取出所有的数据,然后调用$.datatables(option)方法格式化,这种方法显然不太科学, ...

  8. 26&period;如何获得select被选中option的value和text

    如何获得select被选中option的value和text 一:JavaScript原生的方法 1:拿到select对象: var myselect=document.getElementById( ...

  9. 2Y - sort

    给你n个整数,请按从大到小的顺序输出其中前m大的数.  Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-5000 ...

  10. php array&lowbar;merge和运算符&plus;

    其实很多时候我都很疑惑为什么同维度的数组不能直接使用运算+直接进行相加,然后结果就是两个数组合并的在一起的新结果,这个就有点跟array_merge合并函数类似了,接下来就来看下这两种合并的方式到底有 ...