Buffer類,是用來建立一個專門存放二進制數據的緩存區。每當須要處理二進制數據時,就有可能使用到Buffer類。前端
用來聲明一段固定大小的Buffer實例,若是沒有設置fill,則默認填滿0數組
let buffer = Buffer.alloc(6); console.log(buffer); //<Buffer 00 00 00 00 00 00>
let buffer = Buffer.from('前端優選'); console.log(buffer); //<Buffer e5 89 8d e7 ab af e4 bc 98 e9 80 89>
該結果返回的是十六進制、UTF-8編碼格式的字節緩存
//接上個例子 console.log(newBuff.toString()); //前端
toString默認使用的編碼是uft8,返回指定編碼的字符串;該方法還可指定讀取索引的起始結束位置this
let buffer = Buffer.from('前端優選'); let length = buffer.length; console.log(length); //12
返回的是內存區長度;一個漢子包括三個字節,則結果就是4*3=12個字節長度編碼
let buffer = Buffer.from('前端優選'); let result = Buffer.isBuffer(buffer); //true
判斷一個值是否爲Buffer類型,返回的結果爲布爾值spa
let buffer = Buffer.from('前端優選'); let result = buffer.slice(6,12); console.log(result.toString()); //優選
返回一個新的buffer值,和原有值指向同一個內存區prototype
let buffer = Buffer.from('前端優選'); let index = buffer.indexOf('優選'); console.log(index); //6
返回字符串的內存起始位置指針
let buffer1 = Buffer.from('前端'); let buffer2 = Buffer.from('優選'); let buffer3 = Buffer.concat([buffer1,buffer2]); console.log(buffer3); console.log(buffer3.toString()); //<Buffer e5 89 8d e7 ab af e4 bc 98 e9 80 89> //前端優選
返回的值是多個成員合併的新Buffer對象code
指定要拷貝的目標,從目標起始位置開始,拷貝源buffer的指定起始和結束位置之間的字符
該方法沒有返回值,直接對target進行操做對象
let buff1 = Buffer.from('前端'); let buff2 = Buffer.from('優選'); buff1.copy(buff2,0,0,3); console.log(buff2.toString()); //前選(從buff2的0位置起始,拷貝buff1的0-3位置之間的字符,操做對象爲buff2)
Buffer是引用的內存空間,換句話說就是引用類型的值,無論是截取或更改,都是對內存空間的修改,所以都會改變原有的值。
let buffer = Buffer.from([11,12,13]); let newBuff = buffer.slice(0,3); newBuff[0] = 100; console.log(buffer); //<Buffer 64 0c 0d>
let buffer = Buffer.from('前愛端愛優愛選'); let res = buffer.split('愛'); //指望輸出結果:['前','端','優','選'];
那麼須要自定義一個split方法
Buffer.prototype.split = function(step){ let arr = []; return arr; }
首先,須要得出分割字符串的長度
let len = Buffer.from(step).length;
其次,指定每次的分割起始位置
let offset = 0; //初次分割從0開始,而後依次累加
而後,記錄當前分割位置,將已分割和分割字符的長度求和
let current = this.indexOf(step,offset);
對分割的起始位置進行更新
offset = current + len;
循環遍歷,直到查詢結束爲止
while(-1 != this.indexOf(step,offset)){ current = this.indexOf(step,offset); arr.push(this.slice(offset,current)); offset = current + len; }
最終方法爲:
Buffer.prototype.split = function(step){ let len = Buffer.from(step).length; let offset = 0; let current = 0; let arr = []; while(-1 != this.indexOf(step,offset)){ current = this.indexOf(step,offset); arr.push(this.slice(offset,current)); offset = current + len; } arr.push(this.slice(offset)); //將剩餘結果進行添加 return arr.map(item => item.toString()); }
首先看concat的使用方式
let buff1 = Buffer.from('前端'); let buff2 = Buffer.from('優選'); let buff3 = Buffer.concat([buff1,buff2]); console.log(buff3.toString()); //前端優選
分析:該方法至少須要傳遞兩個參數:用於合併的數組列表(必填)、指定合併後的總長度(可選)
Buffer.concat = function(list,length=list.reduce((a,b) => a+b.length,0){ //經過對list的長度求和,計算指定長度 let buffer = Buffer.alloc(length); let offset = 0; list.forEach(item => { item.copy(buffer,0); //利用copy方法,依次複製 offset += item.length; //更新每次的複製指針 }) return buffer; }
Buffer存在於全局對象上,是必需要了解和掌握的知識。Buffer是在內存中開闢一片區域,用來存放二進制數據,在文件的讀取和傳輸上,有着重要的做用。