自定義Buffer方法

Buffer類,是用來建立一個專門存放二進制數據的緩存區。每當須要處理二進制數據時,就有可能使用到Buffer類。前端

1.Buffer的經常使用方法

1.1 Buffer.alloc()

用來聲明一段固定大小的Buffer實例,若是沒有設置fill,則默認填滿0數組

let buffer = Buffer.alloc(6);
console.log(buffer);
//<Buffer 00 00 00 00 00 00>

1.2 Buffer.from()

let buffer = Buffer.from('前端優選');
console.log(buffer);
//<Buffer e5 89 8d e7 ab af e4 bc 98 e9 80 89>

該結果返回的是十六進制、UTF-8編碼格式的字節緩存

1.3 buffer.toString([encoding[,start[,end]]])

//接上個例子
console.log(newBuff.toString());
//前端

toString默認使用的編碼是uft8,返回指定編碼的字符串;該方法還可指定讀取索引的起始結束位置this

1.4 buffer.length

let buffer = Buffer.from('前端優選');
let length = buffer.length;
console.log(length);
//12

返回的是內存區長度;一個漢子包括三個字節,則結果就是4*3=12個字節長度編碼

1.5 Buffer.isBuffer()

let buffer = Buffer.from('前端優選');
let result = Buffer.isBuffer(buffer);
//true

判斷一個值是否爲Buffer類型,返回的結果爲布爾值spa

1.6 buffer.slice(start[,end])

let buffer = Buffer.from('前端優選');
let result = buffer.slice(6,12);
console.log(result.toString());
//優選

返回一個新的buffer值,和原有值指向同一個內存區prototype

1.7 buffer.indexOf()

let buffer = Buffer.from('前端優選');
let index = buffer.indexOf('優選');
console.log(index);
//6

返回字符串的內存起始位置指針

1.8 Buffer.concat(list[,length])

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

1.9 buffer.copy(target[,targetStart[,sourceStart[,sourceEnd]]])

指定要拷貝的目標,從目標起始位置開始,拷貝源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)

2.Buffer的特色

Buffer是引用的內存空間,換句話說就是引用類型的值,無論是截取或更改,都是對內存空間的修改,所以都會改變原有的值。

let buffer = Buffer.from([11,12,13]);
let newBuff = buffer.slice(0,3);
newBuff[0] = 100;
console.log(buffer);
//<Buffer 64 0c 0d>

3.Buffer自定義方法

3.1 split方法

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());
}

3.2 手動實現Buffer的concat方法

首先看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;
}

4.總結

Buffer存在於全局對象上,是必需要了解和掌握的知識。Buffer是在內存中開闢一片區域,用來存放二進制數據,在文件的讀取和傳輸上,有着重要的做用。


前端優選

相關文章
相關標籤/搜索