buffer
對象buffer
在客戶端
Javascript
腳本代碼中,對於二進制數據沒有提供一個很好的支持。然而,在處理TCP流或文件流時,必需要處理二進制數據。所以,在Node.js中,定義了一個Buffer類,該類用來建立一個專門存放二進制數據的緩存區。
簡單來講,Buffer
對象就是爲了處理TCP數據流
(暫且不表)和文件
,好比讀取一個txt
文件,一張jpeg
格式的圖片,或者是一個word
文檔,均可以。javascript
buffer
對象new
關鍵字來建立該類的實例對象var buf = new Buffer()
Buffer
類擁有三種形式的構造函數Buffer
的length
屬性Buffer
對象擁有一個length
屬性,這個屬性值就是建立的Buffer
對象的緩存區大小var buf = new Buffer(100); console.log(buf); console.log(buf.length); // result <Buffer c8 eb 75 9d 93 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 28 6e 3e 23 b3 01 00 00 00 00 00 00 00 00 00 00 f8 65 ... > 100
Buffer
對象buf
對象,沒有被初始化,換句話說,就是每次console.log(buf)
的結果都是不同的,可是這個buf
對象的length
屬性是固定的100
<Buffer a8 ed 1d dc 45 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 98 53 67 75 90 01 00 00 00 00 00 00 00 00 00 00 68 4b ... > // 再次console.log(buf),輸出的結果與上面的不同 <Buffer 78 ec cf e7 62 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 f8 50 58 d9 fc 01 00 00 00 00 00 00 00 00 00 00 c8 48 ... >
Buffer
對象的fill
方法來初始化緩存區中的內容buf.fill(val, [offset], [end])
第一個參數爲必填的Buffer
對象的填充值,填充值均以16進制
計算java
val
參數的值爲0
val
參數爲數值,填充的結果就是參數val
val
參數爲數組或對象,填充的結果所有爲0
val
參數爲true
,填充的結果所有爲1
val
參數爲false
,填充的結果所有爲0
val
參數爲字符串,填充的結果所有爲,每一個字符串中的字符所對應的ascii
表中的值,而且每一個字符依次在length
值內循環第二個參數和第三個參數可選數組
offset
表示爲起始位置寫入,默認爲0
end
表示將數值寫入到第幾個字節處,默認爲length
的值var buf = new Buffer(['a', 'b', 'c']); console.log(buf) // result <Buffer 00 00 00>
var buf = new Buffer(str, [encoding])
str
爲初始化緩存區的字符串,第二個參數encoding
用於指定文字編碼格式的字符串,默認爲utf8
var ascii = new Buffer('aLittleTea一點點', 'ascii'); console.log('ascii ', ascii); // result // ascii <Buffer 61 4c 69 74 74 6c 65 54 65 61 00 b9 b9> var utf8 = new Buffer('aLittleTea一點點', 'utf8'); console.log('utf8 ', utf8); // result // utf8 <Buffer 61 4c 69 74 74 6c 65 54 65 61 e4 b8 80 e7 82 b9 e7 82 b9> var utf16le = new Buffer('aLittleTea一點點', 'utf16le'); console.log('utf16le', utf16le); // result // utf16le <Buffer 61 00 4c 00 69 00 74 00 74 00 6c 00 65 00 54 00 65 00 61 00 00 4e b9 70 b9 70> var ucs2 = new Buffer('aLittleTea一點點', 'ucs2'); console.log('ucs2 ', ucs2); // result // ucs2 <Buffer 61 00 4c 00 69 00 74 00 74 00 6c 00 65 00 54 00 65 00 61 00 00 4e b9 70 b9 70> var base64 = new Buffer('aLittleTea一點點', 'base64'); console.log('base64 ', base64); // result // base64 <Buffer 68 b8 ad b6 57 93 79 af> var binary = new Buffer('aLittleTea一點點', 'binary'); console.log('binary ', binary); // result // binary <Buffer 61 4c 69 74 74 6c 65 54 65 61 00 b9 b9> var hex = new Buffer('aLittleTea', 'hex'); console.log('hex ', hex); // result // hex <Buffer >
在Node.js中,一個字符串的長度與根據該字符串所建立的緩存區的長度並不相同。由於在計算字符串的長度時,以位子做爲一個單位,而在計算緩存區的長度時,以字節做爲一個單位。
一個漢字字符串的長度爲1,可是一個漢字在Buffer
緩存區中字節的長度爲3,換句話說,在Node.js的Buffer
類中,一個漢字的字節長度爲3
var chinese = '一點點奶茶有點兒好喝'; var buf = new Buffer(chinese); console.log(buf); // result // <Buffer e4 b8 80 e7 82 b9 e7 82 b9 e5 a5 b6 e8 8c b6 e6 9c 89 e7 82 b9 e5 84 bf e5 a5 bd e5 96 9d> console.log(chinese.length); // 10 console.log(buf.length); // 30 console.log(chinese[4]); // 茶 console.log(buf[4]); // 130 注:在buf中編碼爲16進制,輸出的結果是10進制 // 修改chinese的某一個字符 chinese[4] = '昔'; // 字符串對象一旦被建立,就不能夠被修改 console.log(chinese); // 一點點奶茶有點兒好喝 // 修改buf的某一個字節 buf[0] = 'e4'; buf[1] = 'ba'; buf[2] = '8c'; console.log(buf) // <Buffer 00 00 00 e7 82 b9 e7 82 b9 e5 a5 b6 e8 8c b6 e6 9c 89 e7 82 b9 e5 84 bf e5 a5 bd e5 96 9d> // 被修改的前三個字節全都是00