Node.js學習之路03——Buffer類初識

buffer對象

1. 什麼是buffer

在客戶端 Javascript腳本代碼中,對於二進制數據沒有提供一個很好的支持。然而,在處理TCP流或文件流時,必需要處理二進制數據。所以,在Node.js中,定義了一個Buffer類,該類用來建立一個專門存放二進制數據的緩存區。

簡單來講,Buffer對象就是爲了處理TCP數據流(暫且不表)和文件,好比讀取一個txt文件,一張jpeg格式的圖片,或者是一個word文檔,均可以。javascript

2. 建立buffer對象

  • 直接使用new關鍵字來建立該類的實例對象
var buf = new Buffer()

3. Buffer類擁有三種形式的構造函數

3.1 將緩存區大小(以字節爲單位)指定爲構造函數的參數

3.1.1 Bufferlength屬性

  • 被建立的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

3.1.2 初始化建立的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的值

3.2 直接使用一個數組來初始化緩存區

var buf = new Buffer(['a', 'b', 'c']);
console.log(buf)
// result
<Buffer 00 00 00>

3.3 直接使用一個字符串來初始化緩存區

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 >

4. 字符串的長度與緩存區的長度

在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
相關文章
相關標籤/搜索