最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法

 更新時(shí)間:2016年11月26日 09:10:19   投稿:daisy  
大家應(yīng)該都知道在客戶端JavaScript腳本代碼中,對二進(jìn)制數(shù)據(jù)并沒有提供一個(gè)很好的支持。然而,在處理TCP流或文件流時(shí),必須要處理二進(jìn)制數(shù)據(jù)。因此,下面通過這篇文章來一起看看利用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法,有需要的朋友們可以參考借鑒。

前言

在Node.js中,定義了一個(gè)Buffer類,該類用來創(chuàng)建一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。這篇文章就詳細(xì)介紹了node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法,下面話不多說,來看看詳細(xì)的介紹。

創(chuàng)建Buffer對象

第一種:直接使用一個(gè)數(shù)組來初始化緩存區(qū)

var arr = [0,1,2]
var buf = new Buffer(arr)
console.log(buf)

執(zhí)行效果:


第二種:直接使用一個(gè)字符串來初始化緩存區(qū)

var str = 'hello'
var buf = new Buffer(str)
console.log(buf)

執(zhí)行效果:


在Node.js中,將自動(dòng)執(zhí)行字符串的輸入輸出時(shí)的編碼與解碼處理,默認(rèn)使用UTF8編碼。

Buffer對象與字符串對象之間的相互轉(zhuǎn)換

(1)toString

可以使用Buffer對象的toString方法將Buffer對象中保存的數(shù)據(jù)轉(zhuǎn)換為字符串,使用方法如下:

buf.toString([encoding],[start],[end])

可選參數(shù)1:用于指定Buffer對象中保存的文字編碼格式,默認(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對象寫入字符串,這時(shí)可以使用該Buffer對象的write方法。

buf.write(string,[offset],[length],[encodign])

必須參數(shù)1:指定需要寫入的字符串

可選參數(shù)2-3:指定字符串轉(zhuǎn)換為字節(jié)數(shù)據(jù)后的寫入位置,字節(jié)數(shù)據(jù)的書寫位置為從第1+offset個(gè)字節(jié)開始到offset+length個(gè)字節(jié)為止。

可選參數(shù)4:編碼格式,默認(rèn)utf8

代碼如下:

var buf = new Buffer('閣下何不隨風(fēng)起')
buf.write('扶搖直上千萬里',0,buf.length)
console.log(buf.toString())

運(yùn)行效果如下:


控制臺(tái)

(3)StringDecoder對象

在Node.js中,也可以使用StringDecoder對象將Buffer對象中的數(shù)據(jù)轉(zhuǎn)換為字符串,該對象的作用與Buffer對象的toString方法的作用相同,但是對于utf8編碼格式的字符串提供了更好的支持。

在使用StringDecoder對象時(shí),首先需要加載Node.js中的string_decoder模塊,方法如下:

var StringDecoder = require('string_decoder').StringDecoder

在加載了string_decoder模塊后,可以創(chuàng)建一個(gè)StringDecoder對象,方法如下:

var decoder = new StringDecoder([encoding])

在需要將Buffer對象中的數(shù)據(jù)轉(zhuǎn)換為字符串時(shí),可以使用StringDecoder對象的write方法,write方法中可以使用一個(gè)參數(shù),用于指定需要被轉(zhuǎn)換的Buffer對象,該方法會(huì)返回轉(zhuǎn)換后的字符串,代碼如下:

decoder.write(buffer)

好,來對比一下Buffer對象的toString方法和StringDecoder的write方法究竟誰對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對象連接起來后再使用toString方法將其中的數(shù)據(jù)轉(zhuǎn)換為字符串,但是當(dāng)Buffer對象的長度較大時(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)

誰支持的更好一眼就可以看出來了。

Buffer對象與JSON對象之間的相互轉(zhuǎn)換

在Node.js中,可以使用JSON.stringify方法將Buffer對象中保存的數(shù)據(jù)轉(zhuǎn)換為一個(gè)字符串,也可以使用JSON.parse方法將一個(gè)經(jīng)過轉(zhuǎn)換后的字符串還原為一個(gè)數(shù)組。

復(fù)制緩存數(shù)據(jù)

當(dāng)需要將Buffer對象中保存的二進(jìn)制數(shù)據(jù)復(fù)制到另一個(gè)Buffer對象中時(shí),可以使用Buffer對象的copy方法,copy方法的使用方法如下:

buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])

必須參數(shù)1:指定復(fù)制的目標(biāo)Buffer對象

可選參數(shù)2:指定目標(biāo)Buffer對象中從第幾個(gè)字節(jié)開始寫入數(shù)據(jù)

可選參數(shù)3:指定從復(fù)制源Buffer對象中獲取數(shù)據(jù)時(shí)的開始位置,默認(rèn)0

可選參數(shù)4:指定從復(fù)制源Buffer對象中獲取數(shù)據(jù)時(shí)的結(jié)束位置,默認(rèn)值為復(fù)制源對象的長度

示例代碼如下:

//目標(biāo):將buf1 Buffer對象中的內(nèi)容復(fù)制到buf2 Buffer對象中
//復(fù)制的目標(biāo)起始位置為buf2 Buffer對象中的第11個(gè)字節(jié)處(第11個(gè)字節(jié)出開始寫入)
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類的類方法

(1)isBuffer方法

用于判斷一個(gè)對象是否為一個(gè)Buffer對象,使用方法如下:

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方法用于檢測一個(gè)字符串是否為一個(gè)有效的編碼格式字符串。使用方法如下:

Buffer.isEncoding(encoding)

在isEncoding方法中,使用一個(gè)參數(shù),用于指定需要被檢測的字符串,如果該字符串為有效的編碼格式字符串,則方法返回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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

最新評論

安福县| 吉木乃县| 汤原县| 山阴县| 余庆县| 郯城县| 丰都县| 于田县| 大同县| 商都县| 临海市| 泾阳县| 庆安县| 达州市| 湾仔区| 偏关县| 库尔勒市| 汝阳县| 咸阳市| 治县。| 绍兴县| 赤峰市| 天水市| 祥云县| 蒙山县| 集贤县| 张家口市| 喀什市| 建瓯市| 瑞安市| 义乌市| 子洲县| 平乐县| 屯留县| 河源市| 固安县| 张家界市| 印江| 海丰县| 丘北县| 西青区|