nodeJS-使用buffer类处理二进制数据
使用buffer类处理二进制数据
在客户端javascript脚本代码中,对于二进制数据并没有提供一个很好的支持。然后在nodejs中需要处理像TCP流或文件流时,必须要处理二进制数据。因此在node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。
一:创建Buffer对象
在node.js中,Buffer类是一个可以在任何模块被利用的全局类,不需要为该类的使用而加载任何模块。可以使用new关键字来创建该类的实例对象。Buffer类可以使用三种方式来构造函数,第一种方式如下:
new Buffer(size)
被创建的buffer对象拥有一个length属性,属性值为缓存区的大小。如下:
我们现在也可以使用Buffer对象的fill方法来初始化缓存区中的所有内容,如下所示:
buf.fill(value,[offset],[end]);
在Buffer对象的fill方法中,可以使用三个参数,第一个参数为必须指定的参数,参数值为需要被写入的数值,第二个参数与第三个参数为可选参数,其中第二个参数用于指定从第几个字节处开始写入被指定的数值,默认值为0,即从缓存区的起始位置写入,第三个参数用于指定将数值一直写入到第几个字节处,默认值为Buffer对象的大小,即书写到缓存区的底部。
现在我们希望从buffer对象的缓存区的第10字节处开始写入1,一直到缓存区底部,如下所示:
我们现在也可以在缓存区的第20到第30字节处(从第20字节开始,不包含第30字节)填入2,演示如下:
Buffer类的第二种形式的构造函数是直接使用一个数组来初始化缓存区,代码如下所示:
new Buffer(array)
演示如下:
Buffer类的第三种形式的构造函数是直接使用一个字符串来初始化缓存区,代码如下:
new Buffer(str,[encoding]);
第一个参数为必须指定的参数,参数值为用于初始化换出区的字符串,第二个参数值为一个用于指定文字编码格式的字符串,默认值为utf-8
如下所示:
在Node.js中,将自动执行字符串的输入输出时的编码与解码处理,默认使用utf-8编码,可以使用编码格式如下表所示:
编码 | 说明 |
ascii | ASCLL字符串 |
utf8 | UTF-8字符串 |
utf16le | UTF-16LE字符串 |
ucs2 | UCS2字符串 |
base64 | 经过BASE64编码后的字符串 |
binary | 二进制数据(不推荐使用) |
hex | 使用16进制数值表示的字符串 |
当使用字符串参数来创建buffer对象并初始化缓存区时,如果使用不同的编码格式,则缓存区中的数据也会有所不同,如下演示:
二:字符串的长度与缓存区的长度
在node.js中,一个字符串的长度与根据该字符串所创建的缓存区的长度并不相同,因为在计算字符串的长度时,是以文字作为一个单位,而在计算缓存区的长度时,是以字节作为一个单位。
比如针对 ”我喜爱编程”这个字符串,该字符串对象的length属性值与根据该字符串创建的buffer对象的length属性值并不相同。因为字符串对象的length属性值获取的是文字个数,而buffer对象的length属性值获取的是缓存区的长度,即缓存区中的字节。
另外,可以使用0开始的序号来取出字符串对象或缓存区中的数据。但是,在获取数据时,字符串对象是以文字作为一个单位,而缓存区对象是以字节作为一个单位。比如,针对一个引用了字符串对象的str变量来说,str[2]获取的是第三个文字,而针对一个引用了缓存区对象的buf对象来说,buf[2]获取的是缓存区中的第三个字节数据转换为整数后的数值。如下:
而buffer对象是可以被修改的。可以通过序号来修改其中某个字节处的数据。如下:
Buffer对象还有一个用于取出指定位置处数据的slice方法,该方法的使用方法与string对象的slice方法相同。
注意:由于buffer对象的slice方法并不是复制缓存区中的数据,而是与该数据共享内存区域,因此,如果修改使用slice方法取出的数据,则缓存区中保存的数据也将被修改。如下演示:
三:Buffer对象与字符串对象之间的相互转换;
1. Buffer对象的toString方法
可以使用Buffer对象的toString方法将Buffer对象中保存的数据转换为字符串,使用方法如下所示:
buf.toString([encoding],[start],[end]);
在Buffer对象的toString方法中,可以使用三个可选参数,第一个参数用于指定Buffer对象中保存的文字编码格式,默认参数值为utf8,第二个及第三个用于指定被转换数据的起始位置和终止位置,以字节为单位。toString方法返回经过转换后的字符串。
四:Buffer对象的write方法
如果要将字符串当做二进制数据来使用,只需将该字符串作为Buffer类的构造函数的参数来创建Buffer对象即可。但是有时候我们需要向已经创建好的Buffer对象中写入字符串,这时候我们可以使用Buffer对象的write方法,代码如下所示:
buf.write(string,[offset],[length],[encoding]);
在buffer对象的write方法中,可以使用四个参数,第一个参数为必须指定的参数,后三个参数为可选参数,第一个参数用于指定需要写入的字符串,第二个参数offset与第三个参数length用于指定字符串转换为字节数据的写入位置。字节数据的书写位置为从第1+offset个字节开始到offset+length个字节为止(列如offset为3,length为8,写入位置为从第4个字节开始到第11个字节为止,包括第4个字节与第11个字节)。第四个参数用于指定写入字符串时使用的编码格式,默认是utf8格式。
如下代码演示:
五:Buffer对象与JSON对象之间的相互转换
在Node.js中,可以使用JSON.stringfy方法将Buffer对象中保存的数据转换为一个字符串,也可以使用JSON.parse方法将一个经过转换后的字符串还原为一个数组。
六:复制缓存数据。
当需要将Buffer对象中保存的二进制数据复制到另一个Buffer对象中时,可以使用Buffer对象的copy方法,copy方法的使用方法如下所示:
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd]);
在Buffer对象的copy方法中,使用四个参数,第一个参数为必须指定的参数,其余三个参数均为可选参数。第一个参数用于指定复制的目标Buffer对象。第二个参数用于指定目标Buffer对象中从第几个字节开始写入数据,参数值为一个小于目标的Buffer对象长度的整数值,默认值为0(从开始处写入数据)。第三个参数用于指定从复制源Buffer对象中获取数据时的开始位置,默认值为0,即从复制源Buffer对象中的第一个字节开始获取数据,第四个参数用于指定从复制源Buffer对象中获取数据时的结束位置,默认值为复制源Buffer对象的长度,即一直获取完毕复制源Buffer对象中的所有剩余数据。
比如如下:将a中buffer对象中的内容复制到b中的buffer对象中,复制的目标起始位置为b的buffer对象中的第11字节处(第11字节处开始写入)。如下所示:
七:Buffer类的类方法
- isBuffer方法
isBuffer方法用于判断一个对象是否为一个Buffer对象,使用方法如下:
Buffer.isBuffer(obj)
在isBuffer方法中,使用一个参数,用于指定需要被判断的对象,如果对象为Buffer对象,方法返回true,否则返回false。演示如下:
2. byteLength方法;
可以使用byteLength方法计算一个指定字符串的字节数,使用方法如下所示:
Buffer.byteLength(string,[encoding]);
在byteLength方法中,使用两个参数,第一个参数为必须输入的参数,用于指定需要计算字节数的字符串,第二个参数为可选参数,用于指定按什么编码方式来计算字节数。默认值为utf8.
如下演示:
3. concat方法。
concat方法用于将几个Buffer对象结合创建为一个新的Buffer对象,使用方法如下所示:
Buffer.concat(list,[totalLength])
在concat方法中,使用两个参数,第一个参数为必须指定的参数,参数值为一个存放了多个buffer对象的数组,concat方法将把其中的所有Buffer对象链接创建为一个Buffer对象;第二个参数为可选参数,用于指定被创建的Buffer对象的长度,当省略该参数时,被创建的Buffer对象为第一个参数数组中所有Buffer对象的长度的合计值。
如果一个参数值为一个空数组或第二个参数值等于0,那么concat方法返回一个长度为0的Buffer对象。
如果第一个参数值数组中只有一个Buffer对象,那么concat方法直接返回该Buffer对象。
如果第一个参数值数组中拥有一个以上的Buffer对象,那么concat方法返回被创建的Buffer对象。
如下演示:
4. isEncoding方法。
isEncoding方法用于检测一个字符串是否为一个有效的编码格式字符串,使用方法如下所示:
Buffer.isEncoding(encoding);
在isEncoding方法中,使用一个参数,用于指定需要被检测的字符串。如果该字符串为有效的编码格式字符串,则方法返回true,如果该字符串不是一个有效的编码格式字符串,则方法返回false。如下演示:
nodeJS-使用buffer类处理二进制数据的更多相关文章
- Node.js之使用Buffer类处理二进制数据
Node.js之使用Buffer类处理二进制数据 Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区. 1. 创建Buffer对象 1.1 直接创建: ...
- Node.js权威指南 (5) - 使用Buffer类处理二进制数据
5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / ...
- node.js—Buffer类(二进制数据处理模块)
Buffer类概述 一个用于更好的操作二进制数据的类 我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流 Node为我们提供了一个更加方便的去操作这种数据流的类 Buffer,他是一个全局的 ...
- 浅析nodejs的buffer类(转)
最近翻阅了node v0.10.4的buffer类的源代码,收获不少,也很久没有在cnode上发表文章了,想把一些收获分享给大家,有什么错误的地方希望大牛们指正啊. 前阵子有位rrestjs框架的使用 ...
- 浅析nodejs的buffer类
1.什么时候该用buffer,什么时候不该用 看一下如下的测试代码,分别是拼接各种不同长度的字符串,最后直接拼接了10MB的字符串 var string,string2,string3; var bu ...
- NodeJS学习笔记 (15)二进制数据-buffer(ok)
模块概览 Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写.网络请求数据的处理等. Buffer的API非常多,本文仅挑选 比较常用/容易理解 的API进行讲解,包 ...
- nodejs第二天之Buffer类
2.1一个更好的操作二进制数据的类,我们在操作文件或者网络数据的时候,其实操作就是二进制数据,Node为我们提供了一个更加方便去操作这种数据流的类Buffer,它是一个全局的类. 2.2三种调用方式 ...
- Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类
一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...
- Buffer类
输入流中可以通过缓冲区来加大读取的效率,sun公司感觉可以加快执行效率,他就为我们提供了一个类来操作缓存区. Buffer来头的类:所有缓冲流都是以Buffer开头的: 学习缓冲流的作用: Buffe ...
随机推荐
- Android - 自定义控件和属性(attr和TypedArray)
http://blog.csdn.net/zjh_1110120/article/details/50976027 1.attr format 取值类型 以ShapeView 为例 <decla ...
- vue + element ui 实现实现动态渲染表格
前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...
- Calendar类的一些不易区分的属性
1.Calendar.MONTH 月份从0-11,获取之后需要加1才能得到真正的月份 2.Calendar.DAY_OF_WEEK 本周的第几天,从星期天开始算 3.Calendar.WEEK_OF_ ...
- HDU3062(2-SAT)
Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- C# HmacSha512 与 java HmacSha512 加密
C# HmacSha512 与 java HmacSha512 加密. /// <summary> /// HmacSha512 加密 /// </summary> /// & ...
- python学习之老男孩python全栈第九期_day002作业
1. 判断下列逻辑语句的True,False.(1) 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6Tru ...
- 自定义高级版python线程池
基于简单版创建类对象过多,现自定义高级版python线程池,代码如下 #高级线程池 import queue import threading import time StopEvent = obje ...
- PHP中类和对象的相关函数
class_exists 判断一个类是否存在,参数为一个名字! interface_exists 判断一个接口是否存在,参数也是为一个名字! method_exists 判断一个方法是否存在! 需要两 ...
- 几个python函数
迭代器 fun函数 过滤作用 s=['a', 'b', 'c'] def fun1(s): if s!='a': return s ret filter(fun1, str) print(ret) ...
- 留言板0.4_model中的数据库(2)
今天就讲讲:如何将后台数据呈现在HTML页面中,以及url配置时的两点技巧吧. 1.首先在"views.py"中提取出后台数据 def getform(request): mess ...