已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9web前端视频教程 /course/web/Node.js开发入门之Buffer用法详解熟悉JavaScript的童鞋应该对Node.js都不陌生,没错Node.js是一个基于Chrome JavaScript运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。Node.js使用事件驱动,非阻塞I/O模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。正是由于Node.js的这些特性使得其在如今的编程中越来越受欢迎,对于新手程序猿来说很有必要掌握Node.js技术。本文小编就将为大家介绍Node.js中Buffer类的使用,希望对大家学习Node.js有帮助吧。其实,Buffer类在Node.js的使用中,经常会用到,特别是在用Node.js做服务端开发时,http、tcp、udp、文件io等等类型的操作,都离不开Buffer类。Buffer是什么Buffer代表一个缓冲区,存储二进制数据,是字节流,在网络传输时,就传输的这种字节流。编码格式虽然一般的字符串是有编码格式的,比如UTF-8。但Buffer是没有编码格式的。两者可以相互转换,转换时必须指定编码格式。在http模块中,http.createServer方法需要的回调函数的原型是:function (req, res) 这个回调的第一个参数,req,类型是http.IncomingMessage,而http.IncomingMessage是一个只读的流,实现了Readable接口,stream.Readable读到的数据(监听data事件可以处理),就是Buffer对象,是字节流。而我们在程序中使用时,经常是要转换为String。反过来,res(类型http.ServerResponse,可写的流,实现了Writable接口)有个方法setDefaultEncoding,用来设置流的编码格式,在write数据时,会使用指定的编码格式来编码数据,然后发送给客户端。这就是说,网络传输的是Buffer,程序需要处理String,Buffer和String之间可以转换。Buffer有toString方法,可以按指定的编码格式将字节流转换为String。在文件系统模块中,fs.createWriteStream和fs.createReadStream两个方法都有一个可选参数options,可以指定defaultEncoding,这里指定的编码格式,也是用于在Buffer和String之间转换的。目前我们在Node.js里,Buffer在转换为字符串时,toString方法的第一个参数就是编码类型,支持常见的编码格式:utf8,多字节编码的Unicode字符,大多数文档和网页采用这种编码格式ascii,8bit编码,一个字符占1个字节utf16le,小端编码的unicode字符utf16be,大端编码的unicodeucs2,unicode编码,每个字符占两个字节base64,Base-64字符串编码hex,每个字节编码为两个十六进制字符假如你不确认某个编码格式是否正确,可以使用Buffer.isEncoding(encoding)方法来测试。在使用Buffer的toString方法时,如果你不指定编码格式,则默认使用utf8来转换。toString原型:buf.toString(encoding, start, end)第一个参数是编码格式,第二个是开始位置(0到buf.length-1),第三个是结束位置(不包含这个索引位置的数据)。创建一个Buffer实例对于Buffer实例的创建,使用new操作符,有四种方法可实现:new Buffer(size),创建一个指buffer定大小的buffernew Buffer(array),根据一个字节数组来创建一个buffernew Buffer(str,encoding),根据一个字符串和编码格式创建buffer,不指定编码时默认使用utf8new Buffer(buffer),根据buffer实例创建一个新的buffer比如下面的代码可以创建Buffer的实例:var buf1 = new Buffer(256);var buf2 = new Buffer(Hello Buffer);var buf3 = new Buffer(0x65,0x66,0x67);var buf4 = new Buffer(buf2);但有一点需要说明的是,使用new Buffer(size)分配的缓冲区,是未初始化的。那块内存里,可能什么都有。试试下面的代码:var buf1 = new Buffer(256);buf1.write(abc);console.log(buf1s content: , buf1.toString();上面的代码企图使用toString转换Buffer,可是你会看到控制台输出了很多乱码修改一下,使用buf.fill()方法填充一下就好了:var buf1 = new Buffer(256);buf1.fill(0);buf1.write(abc);console.log(buf1s content: , buf1.toString();字符串是“0”结尾的,调用了buf1.fill(0)之后,就一切安好。往缓冲区写数据前面我们已经使用了buf.write方法来向缓冲区里写入数据了。write的原型如下:buf.write(string, offset, length, encoding)buf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:string,待写入的字符串对象offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0length,要写入的字节数encoding,代谢如字符串的编码格式,默认为utf8Buffer还有很多其他的方法,让你操作缓冲区。比如writeUInt8、writeUInt16LE、writeUInt16BE、writeUInt31LE、writeUInt32BE、writeInt8、writeInt16LE、writeInt32LE等等。LE - little endian,小端字节序。BE - big endian,大端字节序,即网络字节序。需要说明的是,writeX方法,不像文件一样自动为你保存当前位置,你不指定offset,它就总是从0位置开始写。从缓冲区读数据buf.toString其实是一种读数据的方式。当然,还有其它的,比如bufindex可以根据下标读取字节,buf.readIntXXX,buf.readUIntXXXbuf.toJSON()可以把一个Buffer对象转换为JSON格式。当你针对一个Buffer对象调用JSON.stringify方法时,buf.toJSON()就会被调用。比如:var buf = new Buffer(test);var json = JSON.stringify(buf);console.log(json);/ type:Buffer,data:116,101,115,116缓冲区的长度一个Buffer对象的大小,在创建时就固定下来,创建之后不可改变。如果你觉得Buffer里保存的是字符串时,不妨可以试试下面的代码有助于理解这一点:var buf1 = new Buffer(256);buf1.fill(0);buf1.write(abc);console.log(buf1s length - %d, not 3n, buf1.length);buf1.write(abcdef);console.log(buf1s length - %d, not 6n, buf1.length);另外当你要从确定字符串在缓冲区中占用的字节长度时,不能使用字符串的length属性,因为String.length返回的是字符长度。而对于采用UTF8等编码格式编码的字符串,一个字符可能占用多个字节。所以,String.length所代表的字符串长度和字节长度就不一致。注意,Buffer.length返回的是缓冲区的字节长度,而且是创建时的那个长度,不会随着缓冲内容变化而变化。如果要想衡量一个字符串占用的字节长度,可以使用Buffer.byteLength(string,encoding)这个方法,它会测量一个字符串在指定编码格式下占用的字节长度。具体的,可以看看下面这个例子:var name = new String(who is u5F20u4E09u4E30?);console.log(name.length = %d, name.length);console.log(byteLength = %d, Buffer.byteLength(name, utf8);缓冲区操作Buffer还支持切片、拷贝、拼接、比较等操作。buf.slice(start, end)可以根据起止位置(不包含结束位置对应的数据)对一个缓冲区进行切片,返回一个新的Buffer对象,方便我们操作缓冲区的某个区域。但值得注意的是,这个切片是对原有缓冲区的引用,而不是副本,你对切片内容的修改,实际上修改的是原始的缓冲区。这个方法返回一个代表切片的Buffer对象。buf.copy(targetBuffer, targetStart, sourceStart, sourceEnd)可以将一个缓冲区指定区域的内容拷贝到另一个缓冲的指定区域。类似C语言里的memcpy。targetStart指定目标缓冲区的起始偏移,sourceStart指定源缓冲区的起始偏移,它们默认都是0;sourceEnd指定源缓冲区的结束位置,默认是源缓冲区的长度。实际复制时,会比较目标缓冲区的长度和待复制区域的长度,哪个小按哪个来,不会越界。Buffer有一个类方法,concat(list,totalLength),可以将一串缓冲区拼接成一个。第一个参数list是一个缓冲区数组,第二是待拼接的缓冲区的总长度。如果你不提供totalLength,concat会自己遍历list中的缓冲区计算总长度,会有一点性能损失。这个方法返回拼接后的缓冲区。看个示例代码,演示切片、拷贝和拼接的用法:var buf1 = new Buffer(1234);var buf2 = new Buffer(12567);var bufList = buf1, buf2;var buf3 = Buffer.concat(bufList);console.log(buf3 - %s, buf3.toString();var buf4 = buf3.slice(3, 8);console.log(buf4 - %s, buf4.toString();var buf5 = new Buffer(5);buf3.copy(buf5, 0, 1);console.log(buf5 - %s, buf5.toString();buf.equals(otherBuffer)判断当前缓冲区是否和另一个相等,相等时返回pare(otherBuffer)比较当前缓冲区和另一个缓冲区的大小,相等返回0,小于返回-1,大于返回1。看下面的示例代码:var buf1 = new Buffer(1234);var buf2 = new Buffer(12567);var buf3 = new Buffer(1234);var buf4 = new Buffer(0123);c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年劳务员之劳务员基础知识考试题库200道及完整答案(必刷)
- 2026年设备监理师之质量投资进度控制考试题库200道及一套答案
- 2025江苏省灌南县教育局所属学校冬季赴高校招聘高层次人才66人备考公基题库附答案解析
- 2026重庆市地质矿产勘查开发集团有限公司毕业生校园招聘46人历年真题汇编带答案解析
- 2025福建海峡银行董事会办公室社会招聘参考题库附答案解析
- 2026北京天玛智控科技股份有限公司全球校园招聘笔试模拟试卷附答案解析
- 2025四川成都市泡桐树中学同文分校教师招聘历年真题汇编带答案解析
- 2025年滁州市第一人民医院公开招聘编外工作人员5人备考题库带答案解析
- 2025贵州黔南州粮油储备库主任选聘备考题库附答案解析
- 2026天津医科大学口腔医院人事代理制(第一批)招聘12人备考题库附答案解析
- 糖尿病肾病诊治进展 课件
- MoldFlow实例分析报告-中英文对照课件
- 被巡察单位组织人事工作汇报集合5篇
- 商务英语常用单词
- 泸定桥的资料
- 建设工程施工合同(GF-2017-0201) 专用条款模板
- 现代设备管理课程教学大纲
- 工业硅项目可行性研究报告
- DBJ50∕T-330-2019 增强型水泥基泡沫保温隔声板建筑地面工程应用技术标准
- 《设计心理学》课件5-审美心理学
- 电子束曝光技术页PPT课件
评论
0/150
提交评论