nodejs中的buffer的用法

1、buffer的介紹

  在引入 TypedArray 之前,JavaScript 語言沒有用於讀取或操作二進制數據流的機制。 Buffer 類是作爲 Node.js API 的一部分引入的,用於在 TCP 流、文件系統操作、以及其他上下文中與八位字節流進行交互。

  現在可以使用 TypedArray, Buffer 類以更優化和更適合 Node.js 的方式實現了 Uint8Array API。

  Buffer 類的實例類似於從 0 到 255 之間的整數數組(其他整數會通過 & 255 操作強制轉換到此範圍),但對應於 V8 堆外部的固定大小的原始內存分配。 Buffer 的大小在創建時確定,且無法更改。

  Buffer 類在全局作用域中,因此無需使用 require('buffer').Buffer。

2、buffer中常用的方法

  (1)length toString Buffer.isBuffer slice

   (2) concat indexOf split

/**
 * 1、存儲二進制文件 0 1 最大每個位中不能超過1
 * 2、一個字節幾個位  8個bit位組成
 * 3、漢字 幾個字節組成 gbk 2個字節 node默認不支持gbk編碼
 * 4、utf8 一個漢字  2個字節
 * 5、一個漢字 3個字節 24個位  buffer 將2進制轉化成16進制  只是短而已。
 * 6、buffer中存儲的是16進制  內存 存在聲明的時候 需要制定長度 單位中數字  都是字節單位
 * 數字、字符串、數組
 */
let buffer=Buffer.alloc(10);
console.log(buffer)
let buffer1=Buffer.from('message');  //node utf8 toString()
console.log(buffer1);
let buffer2=Buffer.from([0xe7,0x88,0xb1]);
console.log(buffer2);
console.log(buffer2.toString('utf8')); // 可以和字符串任意轉化
//讀取文件 可能要操作內存  http
// 進制轉換的base64位 加密算法  漢字舉例 3*8=>4*6
let buf=Buffer.from('愛')
console.log(buf);
console.log(0xe7.toString(2));
console.log(0x88.toString(2));
console.log(0xb1.toString(2));

// 00111001 00111000 00100010 00110001 一般轉化成base64 後比原內容 大1/3 最大2*6-1=63 0-63  ==64位置
// 小圖標 icon 可以替換所有的url 不需要發送http請求
// base64的編碼是公開的。
let str='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
str+=str.toLocaleLowerCase();
str+='0123456789+/';
console.log(str[57]+str[56]+str[62]+str[32]); //cookie
//通過編碼可以解決很多問題。
// buffer的聲明方式 3種 長度 數字 數組  buffer不能增大
// 數組 索引 循環 slice 
// Buffer 類在全局作用域中,因此無需使用 require('buffer').Buffer。
let buffer3=Buffer.from([11,12,13]);
let newBuffer=buffer3.slice(0,3);
newBuffer[0]=100;
console.log(buffer3);
console.log(Buffer.isBuffer(buffer3));

// toString 可以將buffer轉化成字符串
// length  可以獲取字節的個數
// Buffer.isBuffer
// copy contact
Buffer.prototype.copy=function(target,targetStart,sourceStart=0,sourceEnd=this.length){
    for(let i=sourceStart;i<sourceEnd;i++){
        target[targetStart+i]=this[i];
    }
}
let buf11=Buffer.from('學');
let buf12=Buffer.from('習');
let buf13=Buffer.alloc(6);
buf11.copy(buf13,0,0,3);
buf12.copy(buf13,3);
console.log(buf13,toString());

// copy, contact 用的很多
console.log(Buffer.concat([buf11,buf12]).toString());

// reduce求和
Buffer.concat=function(bufferList,bufferLength=bufferList.reduce((a,b)=>a+b.length,0)){
    let buffer=Buffer.alloc(bufferLength);
    let offset=0;
    BufferList.forEach(item=>{
        item.copy(buffer,offset);
        offset+=item.length;
    })
    return buffer;
}

// length toString Buffer.isBuffer slice concat
let bufferLove=Buffer.form('我愛你我愛你');
console.log(bufferLove.indexOf('我',6));
bufferLove.split('愛');  //實現buffer的分隔
// 編碼 ASCII 美國 字母 符號都佔用1個字節
// gb2312 兩個字節連起來,算一箇中文  第一個字節如果超過127 下一個字節,組成一個漢字
// gb18030 127*255 =36400
// unicode 編碼
// utf8 基於unicode編碼 實現可編碼

Buffer.prototype.split=function(sep){
    let len=buffer.from(sep).length;
    let offset=0;
    let arr[];
    while(-1!=(current=this.indexOf(sep,offset))){
        arr.push(this.slice(offset,current));
        offset=current+len;
    }
    arr.push(this.slice(offset));
    return arr;
}
// length toString Buffer.isBuffer slice
// concat indexOf split

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章