在客戶端JavaScript腳本代碼中,對於二進制數據並沒有提供一個很好的支持.然而,在處理TCP流或者文件流時,必須要處理二進制數據.因此,在Node.Js中,定義了一個Buffer類,該類用來創建一個專門存放二進制數據的緩沖區.
在Node.js中,Buffer類是一個可以在任何模塊中被利用的全局類,不需要為該類的使用而加載任何模塊.我們可以使用new關鍵字來創建該類的實例對象.Buffer類擁有三種形式的構造函數.
1.只需要將緩沖區大小(以字節為單位)指定為構造函數的參數.
new Buffer(size)
被創建的Buffer對象擁有一個length屬性,屬性值為緩沖區的大小.
打開終端輸入一些命令來創建Buffer對象並查看緩沖區的大小,輸入命令可以看到結果(在命令行窗口中使用十六進制數值來顯示其中的二進制數據).
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer(100);
<Buffer b8 ee 3e 8b 0a 7f 00 00 c0 a5 cb 01 00 00 00 00 c0 a5 cb 01 00 00 00 00 0a 00 00 00 00 00 00 00 48 a6 cb 01 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 ...>
>
2.構造函數可以直接使用一個數組來初始化緩沖區.
new Buffer(array)
在這種形式構造函數中,他使用一個存放了需要被指定數值的數組來作為構造函數的參數.
打開終端輸入一些命令以使用數組創建Buffer對象.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer([0,1,2]);
<Buffer 00 01 02>
>
3.構造函數是直接使用一個字符串來初始化緩沖區.
new Buffer(str,[encoding])
在這種形式的構造函數中,使用兩個參數,其中第一個參數是必須要指定的參數,參數值為用於初始化緩沖區的字符串,第二個參數為一個用於指定文字編碼格式的字符串,默認值為"utf-8".
打開終端輸入一些命令以使用字符串參數創建Buffer對象.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer('我喜歡編程')
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
>
字符串的長度與緩沖區的長度
在Node.js中,一個字符串的長度與根據該字符串所創建的緩沖區的長度並不相同,因為計算字符串的長度時,以字節作為一個單位,而在計算緩沖區的長度時,以字節數作為一個單位.
我們來做個實例,針對"我喜歡編程"這個字符串,該字符串對象的length屬性值與根據該字符串創建的Buffer對象的length屬性值並不相同,因為字符串對象的length屬性獲取的是文字個數,而Buffer對象的length屬性值獲取的是緩沖區的長度,也就是緩沖區的字節數.
打開終端輸入一些命令來創建一個字符串,然后使用該字符串創建一個Buffer對象,然后在控制台中輸出字符串長度與緩沖區的長度.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜歡編程'
'我喜歡編程'
> buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str.length;
5
> buf.length;
15
>
附加點知識,可以使用以0開始的序號去取字符串對象或緩沖區中的數據,但是,在獲取數據時,字符串對象也是以字節作為一個單位,而緩沖區對象(Buffer對象)以字節作為一個單位,假設,針對一個引用了字符串對象的str變量來說,str[2]獲取的第三個文字,而針對一個引用緩沖區對象的buf變量來說,buf[2]獲取的是緩沖區中第三個字節數據轉換為整數后的數值.
打開終端輸入一些命令以使用"我喜歡編程"創建一個字符串與一個Buffer對象並在控制台中輸出字符串中第三個文字和緩沖區中第三個直接數據.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = "我喜歡編程"
'我喜歡編程'
> buf = new Buffer(str)
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str = '我喜歡編程'
'我喜歡編程'
> str [2];
'歡'
> buf [2];
145
>
還有一點就是,字符串對象一旦創建之后就不能在修改
打開終端輸入一些命令以使用"我喜歡編程"創建一個字符串對象並對它進行修改,然后在控制台輸出結果.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜歡編程'
'我喜歡編程'
> str [2] = '囍'
'囍'
> str;
'我喜歡編程'
>
而Buffer對象是可以被修改的.可以通過序號來修改其中某個字節處的數據.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer('我喜歡編程')
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> buf [2] =0;
0
> buf;
<Buffer e6 88 00 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
>
Buffer有一個用於取出指定位置處數據的slice方法,該方法的使用跟string對象的slice方法相同.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜歡編程'
'我喜歡編程'
> buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str.slice(2,4);
'歡編'
> buf.slice(2,4);
<Buffer 91 e5>
>