使用buffer類處理二進制數據javascript
在客戶端javascript腳本代碼中,對於二進制數據並無提供一個很好的支持。而後在nodejs中須要處理像TCP流或文件流時,必需要處理二進制數據。所以在node.js中,定義了一個Buffer類,該類用來建立一個專門存放二進制數據的緩存區。 java
一:建立Buffer對象node
在node.js中,Buffer類是一個能夠在任何模塊被利用的全局類,不須要爲該類的使用而加載任何模塊。能夠使用new關鍵字來建立該類的實例對象。Buffer類能夠使用三種方式來構造函數,第一種方式以下:編程
new Buffer(size)數組
被建立的buffer對象擁有一個length屬性,屬性值爲緩存區的大小。以下:緩存
咱們如今也能夠使用Buffer對象的fill方法來初始化緩存區中的全部內容,以下所示:函數
buf.fill(value,[offset],[end]);編碼
在Buffer對象的fill方法中,能夠使用三個參數,第一個參數爲必須指定的參數,參數值爲須要被寫入的數值,第二個參數與第三個參數爲可選參數,其中第二個參數用於指定從第幾個字節處開始寫入被指定的數值,默認值爲0,即從緩存區的起始位置寫入,第三個參數用於指定將數值一直寫入到第幾個字節處,默認值爲Buffer對象的大小,即書寫到緩存區的底部。spa
如今咱們但願從buffer對象的緩存區的第10字節處開始寫入1,一直到緩存區底部,以下所示:3d
咱們如今也能夠在緩存區的第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方法用於判斷一個對象是否爲一個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。以下演示: