您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關node.js中Buffer緩沖器的原理是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一、什么是Buffer
Buffer緩沖器是用來存儲輸入和輸出數據的一段內存。js語言沒有二進制數據類型,在處理TCP和文件流的時候,就不是很方便了。
所以node.js提供了Buffer類來處理二進制數據,Buffer類是一個全局變量,Buffer在創建的時候大小就固定了,無法改變。
Buffer類的實例類似于由字節元素組成的數組,可以有效的表示二進制數據。
二、什么是字節
字節是計算機存儲時的一種計量單位,一個字節等于8個位。一個位就代表0或1,每8個位(bit)組成一個字節(byte)。
字節是網絡傳輸數據的基本單位,一個字節最大表示的十進制數是255。
三、什么是進制
進制是人為定義的帶進位的計數方法,常見的有二進制,八進制,十六進制,和十進制。
將任意數字轉換成不同進制
console.log(parseInt('12', 2)); console.log(parseInt('12', 8)); console.log(parseInt('12', 16)); console.log(parseInt('12', 10));
轉換進制的另一種方法:
console.log((10).toString(2)); console.log((10).toString(8)); console.log((10).toString(16)); console.log((10).toString(10));
四、創建Buffer的方法
通過Buffer.alloc來創建指定長度Buffer
//創建6個字節的Buffer,用0填充數據 let buf1 = Buffer.alloc(6); console.log(buf1); //指定數字進行填充 let buf2 = Buffer.alloc(6, 2); console.log(buf2); //也可以指定字符進行填充,第三個參數表示字符編碼,默認為utf8 let buf3 = Buffer.alloc(6, 'a', 'utf8'); console.log(buf3);
通過Buffer.allocUnsafe創建未初始化的Buffer,Buffer中的數據是未知的。
let buf = Buffer.allocUnsafe(6); console.log(buf);
通過字節數組創建一個Buffer
let buf = Buffer.from([1, 2, 3, 4, 5]); console.log(buf);
通過字符串創建一個Buffer,第二個參數表示字符編碼,一個中文用3個字節表示。
let buf = Buffer.from('世界你好', 'utf8'); console.log(buf);
五、Buffer的一些常用方法
通過 fill() 以指定的數據填充Buffer
let buf = Buffer.alloc(12); console.log(buf); //參數一表示用來填充的值 //參數二表示開始的偏移量 //參數三表示結束的偏移量 //參數四表示字符編碼 //偏移量的計算是左閉右開的區間,[start, end) buf.fill(1, 0, 2); console.log(buf); buf.fill(2, 2, 4); console.log(buf); buf.fill('A', 4, 6); console.log(buf);
通過 write() 向Buffer中寫入數據
let buf = Buffer.alloc(12); console.log(buf); //參數一表示要寫入的字符串 //參數二表示寫入的偏移量 //參數三表示寫入的字節數 //參數四表示字符編碼 buf.write('世界', 0, 3); console.log(buf); console.log(buf.toString()); buf.write('世界', 3, 6); console.log(buf); console.log(buf.toString());
通過 writeInt8() 寫入一個8位的整數,注意該整數是帶符號的。
let buf = Buffer.alloc(12); console.log(buf); buf.writeInt8(1, 0); buf.writeInt8(2, 1); buf.writeInt8(3, 2); //注意,8位的整數,如果帶符號,區間在 -128 到 127 之間 buf.writeInt8(127, 3); console.log(buf);
方法中還有一些writeInt16BE(),writeInt32BE(),writeInt16LE(),writeInt32LE()的方法。
因為不同的CPU架構,有不同的字節序,字節序是指數字在內存中保存的順序。
以 BE 結尾的,表示 Big Endian ,將高位存儲在起始位置。
以 LE 結尾的,表示 Little Endian,將低位存儲在起始位置。
let buf = Buffer.alloc(6); //將高位存儲在起始位置 buf.writeInt16BE('256', 0); // [01 00 00 00 00 00] console.log(buf); //讀取要與寫入的方法一致,不然數據會錯亂。 console.log(buf.readInt16BE(0)); let buf2 = Buffer.alloc(6); //將低位存儲在起始位置 buf2.writeInt16LE('256', 0); // [00 01 00 00 00 00] console.log(buf2); //讀取要與寫入的方法一致,不然數據會錯亂。 console.log(buf.readInt16LE(0));
通過 toString() 方法,將Buffer解碼成字符串。
let buf = Buffer.alloc(12); buf.write('世', 0, 3); buf.write('界', 3, 3); buf.write('你', 6, 3); buf.write('好', 9, 3); console.log(buf); console.log(buf.toString());
通過 slice() 創建一個新的Buffer切片,但是內存的指向與原Buffer仍然是同一塊內存。
let buf = Buffer.alloc(12, 6); console.log(buf); //參數一表示開始切片偏移量 //參數二表示結束切片偏移量 let buf2 = buf.slice(0, 3); buf2.fill(9); console.log(buf);
通過 copy() 拷貝一個Buffer的數據到另一個Buffer
let t_buf = Buffer.alloc(12); let s_buf = Buffer.alloc(6); s_buf.write('世界', 0); console.log(s_buf.toString()); //參數一表示,拷貝進的Buffer //參數二表示,拷貝進Buffer的開始偏移量 //參數三表示,源Buffer的開始拷貝偏移量 //參數四表示,源Buffer的結束拷貝偏移量 s_buf.copy(t_buf, 0, 0, 6); console.log(t_buf.toString());
通過 Buffer.concat() 可以合并多個Buffer,返回一個新Buffer
let buf1 = Buffer.alloc(6); buf1.write('hello,'); let buf2 = Buffer.alloc(6); buf2.write('世界'); let buf3 = Buffer.concat([buf1, buf2]); console.log(buf3.toString()); //如果合并后的Buffer字節數大于設置的值,則會截斷 let buf4 = Buffer.concat([buf1, buf2], 9); console.log(buf4.toString());
判斷是否為一個Buffer
console.log(Buffer.isBuffer({'name': 'test'})); console.log(Buffer.isBuffer(Buffer.from('test')));
通過 Buffer.byteLength() 獲取字符串字節長度
console.log(Buffer.byteLength('你好,世界'));
以上就是node.js中Buffer緩沖器的原理是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。