Buffer
類是做爲 Node.js API 的一部分引入的,用於在 TCP 流、文件系統操做、以及其餘上下文中與八位字節流進行交互Buffer
是用來處理二進制數據流的Buffer
實例相似於整數數組,可是其長度大小固定(建立後不可修改)Buffer
c++ 在V8堆外分配的物理內存Buffer
是一個全局變量,直接掛載在global下Buffer.alloc()
Buffer.alloc(10)
第一個參數爲長度,不填內容(第二個參數),即用 0 填充Buffer.alloc(10, 1)
第二參數爲填充內容console.log(Buffer.alloc(10)) // 建立一個長度爲10的buffer
// 輸出結果: <Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(Buffer.alloc(10,1)) // 建立一個長度爲10的buffer 而且使用1做爲默認位的填充
// 輸出結果: <Buffer 01 01 01 01 01 01 01 01 01 01>
複製代碼
Buffer.allocUnsafe()
Buffer
。Buffer
.alloc() 更快,Buffer
實例可能包含舊數據,console.log(Buffer.allocUnsafe(10))
// <Buffer 98 fe a5 8d fa 01 00 00 58 ff> 未經初始化的混亂Buffer
複製代碼
Buffer.from()
Buffer.from([1,2,3])
建立一個包含 [0x1, 0x2, 0x3] 的 Buffer。Buffer.from('test', 'latin1')
建立一個包含 Latin-1 字節 [0x74, 0xe9, 0x73, 0x74] 的 Bufferconsole.log(Buffer.from([1,2,3]))
// <Buffer 01 02 03>
console.log(Buffer.from('test', 'latin1'))
// <Buffer 74 65 73 74>
複製代碼
Buffer.byteLength()
Buffer.byteLength('test') // 4 英文字母佔位一個字節
Buffer.byteLength('測試') // 6 中文佔位三個字節
複製代碼
Buffer.isBuffer(obj)
Buffer.isBuffer({}) false
Buffer.isBuffer(Buffer.from([1,2,3])) true
複製代碼
// 用含有三個 `Buffer` 實例的數組建立一個單一的 `Buffer`。
const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;
console.log(totalLength);
// 打印: 42
// 若是已知長度,則明確提供長度會更快
const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
console.log(bufA);
// 打印: <Buffer 00 00 00 00 ...>
console.log(bufA.length);
// 打印: 42
複製代碼
buf.length
const buf = Buffer.from('1212!')
buf.length
複製代碼
buf.toString([encoding[, start[, end]]])
console.log(b.toString())
複製代碼
buf.fill()
const buf1 = Buffer.alloc(10)
console.log(buf1.fill('e',2,5)) //<Buffer 00 00 65 65 65 00 00 00 00 00>
```
複製代碼
buf.equals(otherBuffer)
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');
console.log(buf1.equals(buf2));
// 打印: true
console.log(buf1.equals(buf3));
// 打印: false
複製代碼
buf.indexOf()
相似於數組的 Array.indexOf()
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
// 建立兩個 `Buffer` 實例。
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');
for (let i = 0; i < 26; i++) {
// 97 是 'a' 的十進制 ASCII 值。
buf1[i] = i + 97;
}
// 拷貝 `buf1` 中第 16 至 19 字節偏移量的數據到 `buf2` 第 8 字節偏移量開始。
buf1.copy(buf2, 8, 16, 20);
console.log(buf2.toString('ascii', 0, 25));
// 打印: !!!!!!!!qrst!!!!!!!!!!!!!
複製代碼
// 建立一個 `Buffer`,並拷貝同一 `Buffer` 中一個區域的數據到另外一個重疊的區域。
const buf = Buffer.allocUnsafe(26);
for (let i = 0; i < 26; i++) {
// 97 是 'a' 的十進制 ASCII 值。
buf[i] = i + 97;
}
buf.copy(buf, 0, 4, 10);
console.log(buf.toString());
// 打印: efghijghijklmnopqrstuvwxyz
複製代碼
string_decoder
// 如何去除buffer中文亂碼
const buf = Buffer.from('中文亂碼在此!')
// string_decoder 是buffer的內置模塊
// 將 Buffer 實例寫入 StringDecoder 實例時,將使用內部緩衝區來確保已解碼的字符串不包含任何不完整的多字節字符。
// 它們保存在緩衝區中,直到下一次調用 stringDecoder.write() 或調用 stringDecoder.end() 爲止
// 簡單說就是會自動識別多字節字符,代碼操做出現不完整的狀況下不作輸出,
//而是存儲在內存中,在下一次操做中拼接在起始位置
const { StringDecoder } = require('string_decoder')
const decoder = new StringDecoder('utf8')
for(let i = 0; i< buf.length; i+=5) {
// 生成未初始化的Buffer
const b = Buffer.allocUnsafe(5)
// 拷貝
buf.copy(b, 0, i)
console.log(b.toString())
// 結果
// 中�
// �亂�
// ��在
// 此�
// ��4�║
}
for(let i = 0; i< buf.length; i+=5) {
// 生成未初始化的Buffer
const b = Buffer.allocUnsafe(5)
// 拷貝
buf.copy(b, 0, i)
console.log(decoder.write(b))
}
複製代碼
closenode