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());
// 二點點奶茶有點兒好喝
在這個
0
到3
區間內,實質上對應的是chinese
字串內的一
這個字,如果把3
改成6
,得到的結果依然是二點點奶茶有點兒好喝
,因為申請的空間大於所寫入的空間,所以結果不變。
如果把buf.write(`二`, 0, 3, `utf8`)
中的二
改為二二
,同樣給0
到3
區間,結果依然是二點點奶茶有點兒好喝
,但是如果區間為0
到6
,那麼結果就是二二點奶茶有點兒好喝
,
如果把buf.write(`二`, 0, 3, `utf8`)
改成buf.write(`二二點奶茶不是可口可樂`, 0, 30, `utf8`)
,那麼結果是二二點奶茶不是可口可
,得到的buf
的長度依然是30
所以,也就是說,
buf
的write
方法,只是把原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));