Node中Buffer學習筆記

ReneeTsang發表於2018-06-20

JS語言沒有二進位制資料型別,而在處理TCP和檔案流的時候,必須要處理二進位制資料。NodeJS提供了一個Buffer物件來提供對二進位制資料的操作,比如檔案流的讀寫、網路請求資料的處理等。

Buffer是一個全域性類,無需載入就可使用。Buffer 存的都是16進位制的。

定義buffer的三種方式

1.通過長度建立

  • alloc安全,速度會慢

  • allocUnsafe速度快,但是不安全

// 建立一個長度為 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
// 建立一個長度為 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 建立一個長度為 10、且未初始化的 Buffer。
const buf3 = Buffer.allocUnsafe(10);複製程式碼

2.通過陣列建立

一般都要合法傳遞 0-255之間

// 建立一個包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);複製程式碼

3.通過字串建立

const buf5 = Buffer.from('字串');複製程式碼

buffer常用方法

buffer.fill

相當於手動初始化,擦乾淨桌子,將buffer內容清0

buffer.fill(0);複製程式碼

buffer.toString

  • bufffer.toString([encoding[, start[, end]]])

buffer.toString('utf8',3,6)複製程式碼

buffer.write

buffer.write('前',0,3,'utf8');
buffer.write('端',3,3,'utf8'); //前端複製程式碼

buffer.slice

  • buf.slice([start[, end]]) slice是淺拷貝

let newBuf = buffer.slice(0,4);複製程式碼
// Buffer 和二維陣列是一樣的,Buffer存的都是記憶體地址,請看例項
​
let buffer = Buffer.alloc(6, 1)
let newBuffer = buffer.slice(0, 3)
newBuffer[0] = 100
console.log(buffer)複製程式碼

buffer.copy

複製Buffer 把多個buffer拷貝到一個大buffer上

  • bufffer.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

    引數:目標buffer 引用buffer 起始為止 結束為止 複製位數

let buf5 = Buffer.from('前端開發');
let buf6 = Buffer.alloc(6);
buf5.copy(buf6,0,0,4);
buf5.copy(buf6,3,3,6);
// buf6=前端複製程式碼

手寫一個copy方法

// 目標buffer 目標開始的拷貝位置 源的開始 源的結束位置
Buffer.prototype.myCopy=function(target,targetStart,sourceStart,souceEnd){
    for(var i=0;i<sourceEnd-sourceStart;i++){
        target[i+targetStart]=this[sourceStart+i];
    }
}
buffer2.myCopy(buffer1,1,3,6);
console.log(buffer1.toString())複製程式碼

buffer.concat

  • Buffer.concat(list[, totalLength])

let buf1 = Buffer.from('前');
let buf2 = Buffer.from('端');
let buf3 = Buffer.concat([buf1,buf2],6);
console.log(buf3.toString());複製程式碼

手寫一個concat方法

Buffer.myConcat = function (list,len) {
  if(typeof len === 'undefined'){ // 求拷貝後的長度
    len = list.reduce((current,next,index)=>{
      return current+next.length;
    },0);
  }
  let newBuffer = Buffer.alloc(len); // 申請buffer
  let index = 0;
  list.forEach(buffer =>{ // 將buffer一一拷貝
    buffer.copy(newBuffer, index);
    index+=buffer.length;
  });
  return newBuffer.slice(0,index); // 返回拷貝後的buffer
}
// 接收請求時會採用concat方法進行拼接
console.log(Buffer.myConcat([buffer1, buffer2, buffer3],10).toString());複製程式碼



相關文章