ch05 利用Buffer類處理二進(jìn)制數(shù)據(jù)

1.在客戶端JavaScript腳本代碼中,對(duì)于二進(jìn)制數(shù)據(jù)并沒有提供一個(gè)很好的支持,然而,在處理TCP流或文件流時(shí),必須要處理二進(jìn)制數(shù)據(jù)。因此,在node.js中,定義了一個(gè)Buffer類,該類用來創(chuàng)建一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。

創(chuàng)建Buffer對(duì)象

在node.js中,Buffer類是一個(gè)可以在任何模塊中被利用的全局類,不需要為該類的使用而加載任何模塊??梢允褂胣ew關(guān)鍵字來創(chuàng)建該類的實(shí)例對(duì)象。

Buffer類有三種形式的構(gòu)造函數(shù):

第一種:

只需將緩存區(qū)大?。ㄒ宰止?jié)為單位)指定為構(gòu)造函數(shù)的參數(shù),用法:new Buffer(size)

被創(chuàng)建的Buffer對(duì)象擁有一個(gè)length屬性,屬性值為緩存區(qū)大小

可以使用Buffer對(duì)象的fill方法來初始化緩存區(qū)中的所有內(nèi)容,用法:buf.fill(value, [offset],[end])

—— 第一個(gè)參數(shù)為必須指定的參數(shù),參數(shù)值為需要被寫入的數(shù)值;

——第二個(gè)參數(shù)與第三個(gè)參數(shù)為可選參數(shù),其中第二個(gè)參數(shù)用于指定從第幾個(gè)字節(jié)處開始寫入被制定的數(shù)值,默認(rèn)為0,即從緩存區(qū)的起始位置寫入,第三個(gè)參數(shù)用于指定將數(shù)值一直寫入到第幾字節(jié)處,默認(rèn)值為buffer對(duì)象的大小,即書寫到緩存區(qū)底部

第二種:

直接使用一個(gè)數(shù)組來初始化緩存區(qū),用法:new Buffer(array)

在這種形式的構(gòu)造函數(shù)中,使用了一個(gè)存放了需要被指定數(shù)值的數(shù)組來作為構(gòu)造函數(shù)的參數(shù)。

第三種:

直接使用一個(gè)字符串來初始化緩存區(qū),具體用法:new Buffer( str, [encoding])

在這種形式的構(gòu)造函數(shù)中,使用2個(gè)參數(shù),其中第一個(gè)參數(shù)為必須指定的參數(shù),參數(shù)值為用于初始化緩存區(qū)的字符串,第二個(gè)參數(shù)值為一個(gè)用于指定文字編碼格式的字符串,默認(rèn)為“utf-8”.

在node.js中,將自動(dòng)執(zhí)行字符串的輸入輸出時(shí)的編碼與解碼處理,默認(rèn)使用utf-8編碼,當(dāng)使用字符串參數(shù)來創(chuàng)建buffer對(duì)象并初始化緩存區(qū)時(shí),如果使用不同的編碼格式,則緩存區(qū)中的數(shù)據(jù)也會(huì)有所不同。

字符串的長(zhǎng)度與緩存區(qū)的長(zhǎng)度

在node.js中,一個(gè)字符串的長(zhǎng)度與根據(jù)該字符串所創(chuàng)建的緩存區(qū)的長(zhǎng)度并不相同,因?yàn)樵谟?jì)算字符串長(zhǎng)度是,以文字作為一個(gè)單位,而計(jì)算緩存區(qū)的長(zhǎng)度時(shí),以字節(jié)作為一個(gè)單位。

字符串對(duì)象一旦創(chuàng)建后不可被修改,而buffer對(duì)象是可以被修改的,可以通過序號(hào)來修改其中某個(gè)字節(jié)處的數(shù)據(jù)

字符串對(duì)象擁有搜索字符的index()方法、match()方法與search()方法,可用于替換文字的replace方法以及取出部分字符的substring方法,但是buffer對(duì)象并不具有這些方法,只有一個(gè)用于取出指定位置處數(shù)據(jù)的slice方法,該方法的使用方法與string對(duì)象的slice方法相同

buffer對(duì)象的slice方法并不是復(fù)制緩存區(qū)的數(shù)據(jù),而是與該數(shù)據(jù)共享內(nèi)存區(qū)域,因此,如果修改使用slice方法取出的數(shù)據(jù),則緩存區(qū)中保存的數(shù)據(jù)也將被修改

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

1.buffer對(duì)象的toString方法:

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

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

三個(gè)可選參數(shù),第一個(gè)參數(shù)用于指定buffer對(duì)象中保存的文字編碼格式,默認(rèn)參數(shù)為utf-8

第二個(gè)和第三個(gè)參數(shù)用于指定被轉(zhuǎn)換數(shù)據(jù)的起始位置與終止位置,以字節(jié)為單位。

2.buffer對(duì)象的write方法:

如果要將字符串當(dāng)做二進(jìn)制數(shù)據(jù)來使用,只需要將字符串作為buffer類的構(gòu)造函數(shù)的從參數(shù)來創(chuàng)建buffer對(duì)象即可。但是有時(shí)我們需要向已經(jīng)創(chuàng)建的buffer對(duì)象中寫入字符串,具體用法:

buf.write( string, [offset]; [length], [encoding])

四個(gè)參數(shù),其中第一個(gè)參數(shù)為必須指定參數(shù),后三個(gè)參數(shù)為可選參數(shù)。

第一個(gè)參數(shù)用于指定需要寫入的字符串,第二個(gè)參數(shù)offset與第三個(gè)參數(shù)length用于指定字符串轉(zhuǎn)換為字節(jié)數(shù)據(jù)后的寫入位置。第四個(gè)參數(shù)用于指定寫入字符串時(shí)使用的編碼格式,默認(rèn)為utf-8格式

3.StringDecoder對(duì)象

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

在使用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]);

在StringDecoder類的構(gòu)造函數(shù)中,可以使用一個(gè)可選參數(shù),該參數(shù)用于指定轉(zhuǎn)換字符串時(shí)所使用的編碼格式,默認(rèn)參數(shù)值為utf-8

在需要將Buffer對(duì)象的數(shù)據(jù)轉(zhuǎn)換為字符串時(shí),可以使用StringDecoder對(duì)象的write方法,代碼如下所示:

decode.write(buffer)

在stringDecoder對(duì)象的write方法中,可以使用一個(gè)參數(shù),用于指定需要被轉(zhuǎn)換的buffer對(duì)象,該方法返回轉(zhuǎn)換后的字符串。

StringDecoder對(duì)象的有用之處在于,當(dāng)需要將多個(gè)Buffer對(duì)象的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為文字的場(chǎng)合。

4.Buffer對(duì)象與數(shù)值對(duì)象之間的相互轉(zhuǎn)換

JavaScript中,所有的數(shù)值都是number對(duì)象,雖然在其他語言中,可能存在int和float這種明顯的區(qū)別

雖然在JavaScript中,只需要一個(gè)number對(duì)象就夠了,但是從文件中讀取數(shù)據(jù)或向文件中寫入數(shù)據(jù)的場(chǎng)合中,有些還是需要明確知道數(shù)據(jù)的類型。

在node.js中,為buffer對(duì)象準(zhǔn)備了將buffer對(duì)象中的二進(jìn)制數(shù)據(jù)讀取為JavaScript中的number類型的數(shù)據(jù),或?qū)umber類型的數(shù)據(jù)轉(zhuǎn)換為精確類型后向buffer中寫入的方法

read系列的方法均用于將buffer對(duì)象中的數(shù)據(jù)讀取為number類型的數(shù)據(jù),其中第一個(gè)參數(shù)offset用于指定獲取數(shù)據(jù)的起始位置,以字節(jié)為單位,第二個(gè)參數(shù)noAssert為一個(gè)布爾類型的可選參數(shù),用于指定是否對(duì)offset的值進(jìn)行驗(yàn)證。參數(shù)值為false時(shí),如果offset參數(shù)超出了緩存區(qū)的長(zhǎng)度,則拋出AssertionError異常,參數(shù)值為true時(shí),則不拋出該異常,默認(rèn)值為false。

write系列的方法均用于將number類型的數(shù)據(jù)轉(zhuǎn)換為指定數(shù)據(jù)類型后寫入到緩存區(qū)中,

? ? -第一個(gè)參數(shù)為需要寫入的數(shù)據(jù)

? ? -第二個(gè)參數(shù)(offset)用于指定數(shù)據(jù)的起始寫入位置,以字節(jié)為單位。

? ? -第三個(gè)參數(shù)為一個(gè)布爾類型的可選參數(shù),用于指定是都對(duì)offset的值進(jìn)行驗(yàn)證。參數(shù)值為false時(shí),如果offset參數(shù)值超出了緩存區(qū)的長(zhǎng)度,則拋出AssertionError異常,參數(shù)值為true時(shí),則不拋出該異常,默認(rèn)值為false。

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

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

6 復(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])

在Buffer對(duì)象的copy方法中,使用四個(gè)參數(shù),其中第一個(gè)參數(shù)為必須指定的參數(shù),其余三個(gè)參數(shù)均為可選參數(shù)。

第一個(gè)參數(shù)用于指定復(fù)制的目標(biāo)Buffer對(duì)象。

第二個(gè)參數(shù)用于指定目標(biāo)Buffer對(duì)象中從第幾個(gè)字節(jié)開始寫入數(shù)據(jù),參數(shù)值為一個(gè)小于目標(biāo)Buffer對(duì)象長(zhǎng)度的整數(shù)值,默認(rèn)值為0(從開始處寫入數(shù)據(jù))

第三個(gè)參數(shù)用于指定從復(fù)制源Buffer對(duì)象中獲取數(shù)據(jù)時(shí)的開始位置,默認(rèn)值為0,即從復(fù)制源Buffer對(duì)象中的第一個(gè)字節(jié)開始獲取數(shù)據(jù),

第四個(gè)參數(shù)用于指定從復(fù)制源Buffer對(duì)象中獲取數(shù)據(jù)時(shí)的結(jié)束位置,默認(rèn)值為復(fù)制源Buffer對(duì)象的長(zhǎng)度,即一直獲取完畢復(fù)制源Buffer對(duì)象中的所有剩余數(shù)據(jù)。

7 Buffer類的類方法

在Node.js中,對(duì)Buffer類定義了三個(gè)類方法(相當(dāng)于其他語言中的靜態(tài)方法,在Node.js中稱為類方法)

7.1 isBuffer方法

isBuffer方法用于判斷一個(gè)對(duì)象是否為一個(gè)Buffer對(duì)象,使用方法如下所示。

Buffer.isBuffer(obj)

在isBuffer方法中,使用一個(gè)參數(shù),用于指定需要被判斷的對(duì)象,如果對(duì)象為Buffer對(duì)象,方法返回true,否則返回false。

7.2 byteLength方法

使用byteLength方法計(jì)算一個(gè)指定字符串的字節(jié)數(shù),使用方法如下所示

Buffer.byteLength ( string, [encoding])

? ? -第一個(gè)參數(shù)為必須輸入?yún)?shù),用于指定需要計(jì)算字節(jié)數(shù)的字符串

? ? -第二個(gè)參數(shù)為可選參數(shù),用于指定按什么編碼方式來計(jì)算字節(jié)數(shù),默認(rèn)值為utf8。

7.3 concat方法

concat方法用于將幾個(gè)Buffer對(duì)象結(jié)合創(chuàng)建為一個(gè)新的Buffer對(duì)象,用法如下:

Buffer.concat(list, [totalLength])

第一個(gè)參數(shù)為必須指定的參數(shù),參數(shù)值為一個(gè)存放了多個(gè)Buffer對(duì)象的數(shù)組,concat方法將把其中的所有Buffer對(duì)象聯(lián)結(jié)創(chuàng)建為一個(gè)Buffer對(duì)象

第二個(gè)參數(shù)為可選參數(shù),用于指定被創(chuàng)建的Buffer對(duì)象的總長(zhǎng)度,當(dāng)省略該參數(shù)時(shí),被創(chuàng)建的Buffer對(duì)象為第一個(gè)參數(shù)數(shù)組中所有Buffer對(duì)象的長(zhǎng)度的合計(jì)值。

7.4 isEncoding方法

用于檢測(cè)一個(gè)字符串是否為一個(gè)有效的編碼格式字符串,使用方法如下所示

buffer.isEncoding(encoding)

在isEncoding方法中,使用一個(gè)參數(shù),用于指定需要被檢測(cè)的字符串。如果該字符串為有效的編碼格式字符串,則方法返回true,如果該字符串不是一個(gè)有效的編碼格式字符串,則方法返回false。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容