Node.js學習之路04——Buffer物件與字串

Karuru發表於2019-02-16

Buffer物件與字串

1. Buffer物件的toString()方法

  • Buffer物件中儲存的資料轉換為字串
  • toString([encoding], [start], [end])
  • 第一個引數用於指定Buffer物件中儲存的文字編碼格式,預設引數值為utf8
  • 第二個引數和第三個引數用於指定被轉換資料的起始位置與結束位置,不包含結束位置
var buf = new Buffer(`BUFFER OBJECT`);
console.log(buf);
console.log(buf.toString());
console.log(buf.toString(`utf8`, 2, 5));
// result
<Buffer 42 55 46 46 45 52 20 4f 42 4a 45 43 54>
BUFFER OBJECT
FFE

2. Buffer物件的write()方法

  • 向已經建立的Buffer物件中寫入字串
  • buf.write(string, [offset], [length], [encoding])
  • 第一個引數為指定需要寫入的字串
  • 第二個引數和第三個引數用於指定字串轉換為位元組資料後的寫入位置(包括起始值和結束值)
  • 第四個引數為編碼格式,預設為utf8格式
var chinese = `一點點奶茶有點兒好喝`;
var buf = new Buffer(chinese);
buf.write(`二`, 0, 3, `utf8`); 
console.log(buf.toString());
// 二點點奶茶有點兒好喝

在這個03區間內,實質上對應的是chinese字串內的這個字,如果把3改成6,得到的結果依然是二點點奶茶有點兒好喝,因為申請的空間大於所寫入的空間,所以結果不變。
如果把buf.write(`二`, 0, 3, `utf8`)中的改為二二,同樣給03區間,結果依然是二點點奶茶有點兒好喝,但是如果區間為06,那麼結果就是二二點奶茶有點兒好喝
如果把buf.write(`二`, 0, 3, `utf8`)改成buf.write(`二二點奶茶不是可口可樂`, 0, 30, `utf8`) ,那麼結果是二二點奶茶不是可口可,得到的buf的長度依然是30

所以,也就是說,bufwrite方法,只是把原buf的內容剪下掉,新內容如果剛好能放下,那麼新內容將舊內容替換,如果不能剛好放下,那麼從新內容的起始位置開始計算,能放多少就放多少,多餘的部分捨去,不夠的部分,將不替換舊內容。

說白了,就是buf位元組長度所對應的內容的替換。

3. StringDecoder物件

使用StringDecoder物件將Buffer物件中的資料轉換為字串,該物件的作用與Buffer物件的toString方法的作用相同,但是對於utf8編碼格式的字串提供更好的支援

var StringDecoder =  require(`string_decoder`).StringDecoder;
var decoder = new StringDecoder(`utf8`);
var buf = new Buffer(`新垣結衣が主役の映畫`);
console.log(decoder.write(buf));
// result
// 新垣結衣が主役の映畫

4. Buffer物件與JSON物件的互相轉換

  • JSON.stringify(buf)Buffer物件中儲存的資料轉換為一個字串
var buf = new Buffer(`一點點奶茶有點兒好喝`);
console.log(buf);
// <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>
var jsonBuffer = JSON.stringify(buf);
console.log(jsonBuffer);
{
    "type": "Buffer",
    "data": [228,184,128,231,130,185,231,130,185,229,165,182,232,140,182,230,156,137,231,130,185,229,132,191,229,165,189,229,150,157]
}
var data = [228,184,128,231,130,185,231,130,185,229,165,182,232,140,182,230,156,137,231,130,185,229,132,191,229,165,189,229,150,157];
var newData = []
data.forEach(function(elem){
    newData.push(elem.toString(16))
})
console.log(newData)
// [`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`]
  • 可以發現,對Buffer物件進行JSON.stringify()之後,得到的物件的data屬性的屬性值,轉換成16進位制之後,就是該Buffer物件的位元組值

5. 複製快取資料

  • buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
  • 第一個引數用於指定複製的目標Buffer物件
  • 第二個引數用於指定目標Buffer物件中從第幾個位元組開始寫入資料,預設值是0
  • 第三個引數用於指定複製源Buffer物件中獲取資料時的開始位置,預設值是0
  • 第四個引數用於指定從複製源Buffer物件中獲取資料時的結束位置,預設值是複製源Buffer物件的長度
var buf1 = new Buffer(`新垣結衣が主役の映畫「ミックス」が中國で公開へ`);
console.log(buf1);
var buf2 = Buffer(256).fill(0);
console.log(buf2);
buf1.copy(buf2, 10, 12, 30);
console.log(buf2.toString());
/***
 * <Buffer e6 96 b0 e5 9e a3 e7 b5 90 e8 a1 a3 e3 81 8c e4 b8 bb e5 bd b9 e3 81 ae e6 98 a0 e7 94 bb e3 80 8c e3 83 9f e3 83 83 e3 82 af e3 82 b9 e3 80 8d e3 81 ... >
 * <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >
 *           が主役の映畫                                                                                                                                         
 ***/

buf1有值,buf2想要複製buf1的值,那麼就是buf1.copy(buf2, <buf2要被貼上的起始位置>, <buf1要被複制的起始位置>, <buf1要被複制的結束位置>)

6. Buffer類的類方法

6.1 isBuffer方法
  • Buffer.isBuffer(buf)
  • 判斷一個物件是否為一個Buffer物件,返回結果為true或者false
6.2 byteLength方法
  • Buffer.byteLength(string, [encoding])
  • 在不同的編碼格式下,同一個字元的位元組長度是不一樣的
var japanese = `新垣結衣`;
console.log(Buffer.byteLength(japanese, `utf8`));   //12
console.log(Buffer.byteLength(japanese, `utf16le`));//8
console.log(Buffer.byteLength(japanese, `base64`)); //3
console.log(Buffer.byteLength(japanese, `hex`));    //2
console.log(Buffer.byteLength(japanese, `ascii`));  //4
6.3. concat方法,拼接Buffer物件的值
  • 與字串和陣列的concat方法使用相同
var buf1 = new Buffer(`新垣結衣が主役の映畫`);
var buf2 = new Buffer(`「ミックス」`);
var buf3 = new Buffer(`が中國で公開へ`);
console.log(Buffer.concat([buf1, buf2, buf3]).toString());
// result
// 新垣結衣が主役の映畫「ミックス」が中國で公開へ
6.4. isEncoding方法
  • Buffer.isEncoding(encoding)
  • 檢測一個字串是否為一個有效的編碼格式字串
var code = `utf8`;
console.log(Buffer.isEncoding(code));

相關文章