node.js中Buffer緩沖器的原理與使用方法分析
本文實(shí)例講述了node.js中Buffer緩沖器的原理與使用方法。分享給大家供大家參考,具體如下:
一、什么是Buffer
Buffer緩沖器是用來存儲(chǔ)輸入和輸出數(shù)據(jù)的一段內(nèi)存。js語言沒有二進(jìn)制數(shù)據(jù)類型,在處理TCP和文件流的時(shí)候,就不是很方便了。
所以node.js提供了Buffer類來處理二進(jìn)制數(shù)據(jù),Buffer類是一個(gè)全局變量,Buffer在創(chuàng)建的時(shí)候大小就固定了,無法改變。
Buffer類的實(shí)例類似于由字節(jié)元素組成的數(shù)組,可以有效的表示二進(jìn)制數(shù)據(jù)。
二、什么是字節(jié)
字節(jié)是計(jì)算機(jī)存儲(chǔ)時(shí)的一種計(jì)量單位,一個(gè)字節(jié)等于8個(gè)位。一個(gè)位就代表0或1,每8個(gè)位(bit)組成一個(gè)字節(jié)(byte)。
字節(jié)是網(wǎng)絡(luò)傳輸數(shù)據(jù)的基本單位,一個(gè)字節(jié)最大表示的十進(jìn)制數(shù)是255。
三、什么是進(jìn)制
進(jìn)制是人為定義的帶進(jìn)位的計(jì)數(shù)方法,常見的有二進(jìn)制,八進(jìn)制,十六進(jìn)制,和十進(jìn)制。
將任意數(shù)字轉(zhuǎn)換成不同進(jìn)制
console.log(parseInt('12', 2)); console.log(parseInt('12', 8)); console.log(parseInt('12', 16)); console.log(parseInt('12', 10));
轉(zhuǎn)換進(jìn)制的另一種方法:
console.log((10).toString(2)); console.log((10).toString(8)); console.log((10).toString(16)); console.log((10).toString(10));
四、創(chuàng)建Buffer的方法
通過Buffer.alloc來創(chuàng)建指定長度Buffer
//創(chuàng)建6個(gè)字節(jié)的Buffer,用0填充數(shù)據(jù) let buf1 = Buffer.alloc(6); console.log(buf1); //指定數(shù)字進(jìn)行填充 let buf2 = Buffer.alloc(6, 2); console.log(buf2); //也可以指定字符進(jìn)行填充,第三個(gè)參數(shù)表示字符編碼,默認(rèn)為utf8 let buf3 = Buffer.alloc(6, 'a', 'utf8'); console.log(buf3);
通過Buffer.allocUnsafe創(chuàng)建未初始化的Buffer,Buffer中的數(shù)據(jù)是未知的。
let buf = Buffer.allocUnsafe(6); console.log(buf);
通過字節(jié)數(shù)組創(chuàng)建一個(gè)Buffer
let buf = Buffer.from([1, 2, 3, 4, 5]); console.log(buf);
通過字符串創(chuàng)建一個(gè)Buffer,第二個(gè)參數(shù)表示字符編碼,一個(gè)中文用3個(gè)字節(jié)表示。
let buf = Buffer.from('世界你好', 'utf8'); console.log(buf);
五、Buffer的一些常用方法
通過 fill() 以指定的數(shù)據(jù)填充Buffer
let buf = Buffer.alloc(12); console.log(buf); //參數(shù)一表示用來填充的值 //參數(shù)二表示開始的偏移量 //參數(shù)三表示結(jié)束的偏移量 //參數(shù)四表示字符編碼 //偏移量的計(jì)算是左閉右開的區(qū)間,[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中寫入數(shù)據(jù)
let buf = Buffer.alloc(12); console.log(buf); //參數(shù)一表示要寫入的字符串 //參數(shù)二表示寫入的偏移量 //參數(shù)三表示寫入的字節(jié)數(shù) //參數(shù)四表示字符編碼 buf.write('世界', 0, 3); console.log(buf); console.log(buf.toString()); buf.write('世界', 3, 6); console.log(buf); console.log(buf.toString());
通過 writeInt8() 寫入一個(gè)8位的整數(shù),注意該整數(shù)是帶符號(hào)的。
let buf = Buffer.alloc(12); console.log(buf); buf.writeInt8(1, 0); buf.writeInt8(2, 1); buf.writeInt8(3, 2); //注意,8位的整數(shù),如果帶符號(hào),區(qū)間在 -128 到 127 之間 buf.writeInt8(127, 3); console.log(buf);
方法中還有一些writeInt16BE(),writeInt32BE(),writeInt16LE(),writeInt32LE()的方法。
因?yàn)椴煌腃PU架構(gòu),有不同的字節(jié)序,字節(jié)序是指數(shù)字在內(nèi)存中保存的順序。
以 BE 結(jié)尾的,表示 Big Endian ,將高位存儲(chǔ)在起始位置。
以 LE 結(jié)尾的,表示 Little Endian,將低位存儲(chǔ)在起始位置。
let buf = Buffer.alloc(6); //將高位存儲(chǔ)在起始位置 buf.writeInt16BE('256', 0); // [01 00 00 00 00 00] console.log(buf); //讀取要與寫入的方法一致,不然數(shù)據(jù)會(huì)錯(cuò)亂。 console.log(buf.readInt16BE(0)); let buf2 = Buffer.alloc(6); //將低位存儲(chǔ)在起始位置 buf2.writeInt16LE('256', 0); // [00 01 00 00 00 00] console.log(buf2); //讀取要與寫入的方法一致,不然數(shù)據(jù)會(huì)錯(cuò)亂。 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() 創(chuàng)建一個(gè)新的Buffer切片,但是內(nèi)存的指向與原Buffer仍然是同一塊內(nèi)存。
let buf = Buffer.alloc(12, 6); console.log(buf); //參數(shù)一表示開始切片偏移量 //參數(shù)二表示結(jié)束切片偏移量 let buf2 = buf.slice(0, 3); buf2.fill(9); console.log(buf);
通過 copy() 拷貝一個(gè)Buffer的數(shù)據(jù)到另一個(gè)Buffer
let t_buf = Buffer.alloc(12); let s_buf = Buffer.alloc(6); s_buf.write('世界', 0); console.log(s_buf.toString()); //參數(shù)一表示,拷貝進(jìn)的Buffer //參數(shù)二表示,拷貝進(jìn)Buffer的開始偏移量 //參數(shù)三表示,源Buffer的開始拷貝偏移量 //參數(shù)四表示,源Buffer的結(jié)束拷貝偏移量 s_buf.copy(t_buf, 0, 0, 6); console.log(t_buf.toString());
通過 Buffer.concat() 可以合并多個(gè)Buffer,返回一個(gè)新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字節(jié)數(shù)大于設(shè)置的值,則會(huì)截?cái)? let buf4 = Buffer.concat([buf1, buf2], 9); console.log(buf4.toString());
判斷是否為一個(gè)Buffer
console.log(Buffer.isBuffer({'name': 'test'})); console.log(Buffer.isBuffer(Buffer.from('test')));
通過 Buffer.byteLength() 獲取字符串字節(jié)長度
console.log(Buffer.byteLength('你好,世界'));
希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。
相關(guān)文章
Node.js中MongoDB查詢數(shù)據(jù)的方法
在Node.js中,可以使用MongoDB驅(qū)動(dòng)程序和Mongoose庫來進(jìn)行MongoDB的查詢操作,本文就來介紹一下Node.js中MongoDB查詢數(shù)據(jù)的方法,感興趣的可以了解一下2023-12-12nodejs實(shí)現(xiàn)解析xml字符串為對(duì)象的方法示例
這篇文章主要介紹了nodejs實(shí)現(xiàn)解析xml字符串為對(duì)象的方法,涉及nodejs針對(duì)xml格式字符串的解析與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-03-03在NodeJs中使用node-schedule增加定時(shí)器任務(wù)的方法
這篇文章主要介紹了從零開始在NodeJs中使用node-schedule增加定時(shí)器任務(wù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Nodejs學(xué)習(xí)筆記之測試驅(qū)動(dòng)
本文是本系列文章的第二篇,主要是測試針對(duì)于web后端的驅(qū)動(dòng),在開發(fā)過程中,在開發(fā)完成一段代碼后如果負(fù)責(zé)任而不是說完全把問題交給測試人員去發(fā)現(xiàn)的話,這個(gè)時(shí)候通常都會(huì)去做一些手動(dòng)的測試。2015-04-04用純Node.JS彈出Windows系統(tǒng)消息提示框?qū)嵗?MessageBox)
這篇文章主要介紹了用純Node.JS彈出Windows系統(tǒng)消息提示框?qū)嵗?MessageBox),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05