使用node.js中的Buffer類(lèi)處理二進(jìn)制數(shù)據(jù)的方法
前言
在Node.js中,定義了一個(gè)Buffer類(lèi),該類(lèi)用來(lái)創(chuàng)建一個(gè)專(zhuān)門(mén)存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。這篇文章就詳細(xì)介紹了node.js中的Buffer類(lèi)處理二進(jìn)制數(shù)據(jù)的方法,下面話(huà)不多說(shuō),來(lái)看看詳細(xì)的介紹。
創(chuàng)建Buffer對(duì)象
第一種:直接使用一個(gè)數(shù)組來(lái)初始化緩存區(qū)
var arr = [0,1,2] var buf = new Buffer(arr) console.log(buf)
執(zhí)行效果:
第二種:直接使用一個(gè)字符串來(lái)初始化緩存區(qū)
var str = 'hello' var buf = new Buffer(str) console.log(buf)
執(zhí)行效果:
在Node.js中,將自動(dòng)執(zhí)行字符串的輸入輸出時(shí)的編碼與解碼處理,默認(rèn)使用UTF8編碼。
Buffer對(duì)象與字符串對(duì)象之間的相互轉(zhuǎn)換
(1)toString
可以使用Buffer對(duì)象的toString方法將Buffer對(duì)象中保存的數(shù)據(jù)轉(zhuǎn)換為字符串,使用方法如下:
buf.toString([encoding],[start],[end])
可選參數(shù)1:用于指定Buffer對(duì)象中保存的文字編碼格式,默認(rèn)參數(shù)為UTF8。
可選參數(shù)2:指定被轉(zhuǎn)換數(shù)據(jù)的起始位置,以字節(jié)為單位。
可選參數(shù)3:指定被轉(zhuǎn)換數(shù)據(jù)的終止位置,以字節(jié)為單位。
示例代碼如下:
var buf = new Buffer('閣下何不隨風(fēng)起') console.log(buf) console.log(buf.toString('utf8',9,12)) console.log(buf.toString('utf8',12,buf.length))
效果如下:
控制臺(tái)
(2)write
有時(shí)我們需要向已經(jīng)創(chuàng)建的Buffer對(duì)象寫(xiě)入字符串,這時(shí)可以使用該Buffer對(duì)象的write方法。
buf.write(string,[offset],[length],[encodign])
必須參數(shù)1:指定需要寫(xiě)入的字符串
可選參數(shù)2-3:指定字符串轉(zhuǎn)換為字節(jié)數(shù)據(jù)后的寫(xiě)入位置,字節(jié)數(shù)據(jù)的書(shū)寫(xiě)位置為從第1+offset個(gè)字節(jié)開(kāi)始到offset+length個(gè)字節(jié)為止。
可選參數(shù)4:編碼格式,默認(rèn)utf8
代碼如下:
var buf = new Buffer('閣下何不隨風(fēng)起') buf.write('扶搖直上千萬(wàn)里',0,buf.length) console.log(buf.toString())
運(yùn)行效果如下:
控制臺(tái)
(3)StringDecoder對(duì)象
在Node.js中,也可以使用StringDecoder對(duì)象將Buffer對(duì)象中的數(shù)據(jù)轉(zhuǎn)換為字符串,該對(duì)象的作用與Buffer對(duì)象的toString方法的作用相同,但是對(duì)于utf8編碼格式的字符串提供了更好的支持。
在使用StringDecoder對(duì)象時(shí),首先需要加載Node.js中的string_decoder模塊,方法如下:
var StringDecoder = require('string_decoder').StringDecoder
在加載了string_decoder模塊后,可以創(chuàng)建一個(gè)StringDecoder對(duì)象,方法如下:
var decoder = new StringDecoder([encoding])
在需要將Buffer對(duì)象中的數(shù)據(jù)轉(zhuǎn)換為字符串時(shí),可以使用StringDecoder對(duì)象的write方法,write方法中可以使用一個(gè)參數(shù),用于指定需要被轉(zhuǎn)換的Buffer對(duì)象,該方法會(huì)返回轉(zhuǎn)換后的字符串,代碼如下:
decoder.write(buffer)
好,來(lái)對(duì)比一下Buffer對(duì)象的toString方法和StringDecoder的write方法究竟誰(shuí)對(duì)utf8支持的更好。
Buffer的toString方法如下:
//在UTF-8編碼格式下,將1個(gè)文字轉(zhuǎn)換為多個(gè)字節(jié) var buf = new Buffer('閣下何不隨風(fēng)起') console.log(buf) //0x是我手動(dòng)加的 var str1 = new Buffer([0xe9, 0x98, 0x81, 0xe4, 0xb8, 0x8b, 0xe4, 0xbd]) console.log(str1.toString()) var str2 = new Buffer([0x95, 0xe4, 0xb8, 0x8d, 0xe9, 0x9a, 0x8f, 0xe9, 0xa3, 0x8e, 0xe8, 0xb5, 0xb7]) console.log(str2.toString())
運(yùn)行效果如下:
控制臺(tái)
當(dāng)然,也可以用如下方法將兩個(gè)buffer對(duì)象連接起來(lái)后再使用toString方法將其中的數(shù)據(jù)轉(zhuǎn)換為字符串,但是當(dāng)Buffer對(duì)象的長(zhǎng)度較大時(shí),這種操作的性能將會(huì)變得比較地下。
Buffer.concat([str1,str2]).toString()
StringDecoder的write方法如下:
//在UTF-8編碼格式下,將1個(gè)文字轉(zhuǎn)換為多個(gè)字節(jié) var buf = new Buffer('閣下何不隨風(fēng)起') console.log(buf) //StringDecoder var StringDecoder = require('string_decoder').StringDecoder var decoder = new StringDecoder() //0x是我手動(dòng)加的 var str1 = new Buffer([0xe9, 0x98, 0x81, 0xe4, 0xb8, 0x8b, 0xe4, 0xbd]) console.log(decoder.write(str1)) var str2 = new Buffer([0x95, 0xe4, 0xb8, 0x8d, 0xe9, 0x9a, 0x8f, 0xe9, 0xa3, 0x8e, 0xe8, 0xb5, 0xb7]) console.log(decoder.write(str2))
運(yùn)行效果如下:
控制臺(tái)
誰(shuí)支持的更好一眼就可以看出來(lái)了。
Buffer對(duì)象與JSON對(duì)象之間的相互轉(zhuǎn)換
在Node.js中,可以使用JSON.stringify方法將Buffer對(duì)象中保存的數(shù)據(jù)轉(zhuǎn)換為一個(gè)字符串,也可以使用JSON.parse方法將一個(gè)經(jīng)過(guò)轉(zhuǎn)換后的字符串還原為一個(gè)數(shù)組。
復(fù)制緩存數(shù)據(jù)
當(dāng)需要將Buffer對(duì)象中保存的二進(jìn)制數(shù)據(jù)復(fù)制到另一個(gè)Buffer對(duì)象中時(shí),可以使用Buffer對(duì)象的copy方法,copy方法的使用方法如下:
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])
必須參數(shù)1:指定復(fù)制的目標(biāo)Buffer對(duì)象
可選參數(shù)2:指定目標(biāo)Buffer對(duì)象中從第幾個(gè)字節(jié)開(kāi)始寫(xiě)入數(shù)據(jù)
可選參數(shù)3:指定從復(fù)制源Buffer對(duì)象中獲取數(shù)據(jù)時(shí)的開(kāi)始位置,默認(rèn)0
可選參數(shù)4:指定從復(fù)制源Buffer對(duì)象中獲取數(shù)據(jù)時(shí)的結(jié)束位置,默認(rèn)值為復(fù)制源對(duì)象的長(zhǎng)度
示例代碼如下:
//目標(biāo):將buf1 Buffer對(duì)象中的內(nèi)容復(fù)制到buf2 Buffer對(duì)象中 //復(fù)制的目標(biāo)起始位置為buf2 Buffer對(duì)象中的第11個(gè)字節(jié)處(第11個(gè)字節(jié)出開(kāi)始寫(xiě)入) var buf1 = new Buffer('閣下何不隨風(fēng)起') console.log(buf1) var buf2 = new Buffer(128) buf2.fill(0) console.log(buf2) //關(guān)鍵代碼 buf1.copy(buf2,10) //輸出復(fù)制后的buf2 console.log(buf2) //以字符串的形式打印buf2 var StringDecoder = require('string_decoder').StringDecoder var decoder = new StringDecoder() console.log(decoder.write(buf2))
運(yùn)行效果如下:
控制臺(tái)
Buffer類(lèi)的類(lèi)方法
(1)isBuffer方法
用于判斷一個(gè)對(duì)象是否為一個(gè)Buffer對(duì)象,使用方法如下:
Buffer.isBuffer(objc)
示例代碼如下:
var a = 'abcde' var b = new Buffer(10) console.log(typeof a) console.log(typeof b) console.log('---我是奇妙的分隔符----') console.log(Buffer.isBuffer(a)) console.log(Buffer.isBuffer(b))
運(yùn)行結(jié)果:
控制臺(tái)
(2)byteLength方法
可以使用ByteLength方法計(jì)算一個(gè)指定字符串的字節(jié)數(shù),使用方法如下:
Buffer.byteLength(string,[encoding])
必須參數(shù)1:指定需要計(jì)算字節(jié)數(shù)的字符串
可選參數(shù)2:編碼格式,默認(rèn)utf8
示例代碼如下:
var str = '閣下何不隨風(fēng)起' console.log(str.length) console.log(Buffer.byteLength(str,'utf8')) console.log(Buffer.byteLength(str,'base64')) console.log(Buffer.byteLength(str,'utf16le'))
運(yùn)行結(jié)果如下:
控制臺(tái)
(3)isEncoding方法
isEncoding方法用于檢測(cè)一個(gè)字符串是否為一個(gè)有效的編碼格式字符串。使用方法如下:
Buffer.isEncoding(encoding)
在isEncoding方法中,使用一個(gè)參數(shù),用于指定需要被檢測(cè)的字符串,如果該字符串為有效的編碼格式字符串,則方法返回true,如果該字符串不是一個(gè)有效的編碼格式字符串,則方法返回false。
示例代碼如下:
var str1 = 'utf8' console.log(Buffer.isEncoding(str1)) var str2 = 'utf16le' console.log(Buffer.isEncoding(str2)) var str3= 'utf16e' console.log(Buffer.isEncoding(str3))
運(yùn)行效果如下:
控制臺(tái)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- Node.js中使用Buffer編碼、解碼二進(jìn)制數(shù)據(jù)詳解
- Node.js Windows Binary二進(jìn)制文件安裝方法
- node.js中Buffer緩沖器的原理與使用方法分析
- Node.js Buffer模塊功能及常用方法實(shí)例分析
- 詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
- Node.js Buffer用法解讀
- 關(guān)于Node.js中Buffer的一些你可能不知道的用法
- 淺談Node.js:Buffer模塊
- Node.js實(shí)用代碼段之正確拼接Buffer
- Node.js實(shí)用代碼段之獲取Buffer對(duì)象字節(jié)長(zhǎng)度
- node.js中的buffer.copy方法使用說(shuō)明
- node.js中的buffer.fill方法使用說(shuō)明
- node.js中的buffer.length方法使用說(shuō)明
- node.js中的buffer.toJSON方法使用說(shuō)明
- node.js中的buffer.toString方法使用說(shuō)明
- node.js中的buffer.Buffer.isEncoding方法使用說(shuō)明
- node.js中的buffer.Buffer.isBuffer方法使用說(shuō)明
- node.js中的buffer.Buffer.byteLength方法使用說(shuō)明
- node.js中的buffer.slice方法使用說(shuō)明
- node.JS二進(jìn)制操作模塊buffer對(duì)象使用方法詳解
相關(guān)文章
Ubuntu中搭建Nodejs開(kāi)發(fā)環(huán)境過(guò)程分享
這篇文章主要介紹了Ubuntu中搭建Nodejs開(kāi)發(fā)環(huán)境過(guò)程,比較郁悶的是apt-get安裝失敗了,如果有遇到一樣問(wèn)題的朋友,可以參考一下本文2014-06-06利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能
這篇文章為大家詳細(xì)介紹了如何利用node+koa+axios實(shí)現(xiàn)圖片上傳和回顯功能,主要實(shí)現(xiàn)簡(jiǎn)單的圖片上傳和靜態(tài)內(nèi)容的訪(fǎng)問(wèn),感興趣的可以了解一下2022-05-05解決npm管理員身份install時(shí)出現(xiàn)權(quán)限的問(wèn)題
下面小編就為大家分享一篇解決npm管理員身份install時(shí)出現(xiàn)權(quán)限的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03node通過(guò)npm寫(xiě)一個(gè)cli命令行工具
本篇文章主要介紹了node通過(guò)npm寫(xiě)一個(gè)cli命令行工具 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Node.js利用斷言模塊assert進(jìn)行單元測(cè)試的方法
最近在用Node寫(xiě)一個(gè)實(shí)時(shí)聊天小應(yīng)用,其中就用到了單元測(cè)試,所以死下面這篇文章主要給大家介紹了關(guān)于Node.js利用斷言模塊assert進(jìn)行單元測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09