最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js中Buffer緩沖器的原理與使用方法分析

 更新時(shí)間:2019年11月23日 11:15:25   作者:懷素真  
這篇文章主要介紹了node.js中Buffer緩沖器的原理與使用方法,結(jié)合實(shí)例形式分析了node.js Buffer緩沖器的基本概念、原理、創(chuàng)建、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了node.js中Buffer緩沖器的原理與使用方法。分享給大家供大家參考,具體如下:

一、什么是Buffer

Buffer緩沖器是用來(lái)存儲(chǔ)輸入和輸出數(shù)據(jù)的一段內(nèi)存。js語(yǔ)言沒(méi)有二進(jìn)制數(shù)據(jù)類(lèi)型,在處理TCP和文件流的時(shí)候,就不是很方便了。

所以node.js提供了Buffer類(lèi)來(lái)處理二進(jìn)制數(shù)據(jù),Buffer類(lèi)是一個(gè)全局變量,Buffer在創(chuàng)建的時(shí)候大小就固定了,無(wú)法改變。

Buffer類(lèi)的實(shí)例類(lèi)似于由字節(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ù)方法,常見(jiàn)的有二進(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的方法

通過(guò)Buffer.alloc來(lái)創(chuàng)建指定長(zhǎ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);

通過(guò)Buffer.allocUnsafe創(chuàng)建未初始化的Buffer,Buffer中的數(shù)據(jù)是未知的。

let buf = Buffer.allocUnsafe(6);
console.log(buf);

通過(guò)字節(jié)數(shù)組創(chuàng)建一個(gè)Buffer

let buf = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf);

通過(guò)字符串創(chuàng)建一個(gè)Buffer,第二個(gè)參數(shù)表示字符編碼,一個(gè)中文用3個(gè)字節(jié)表示。

let buf = Buffer.from('世界你好', 'utf8');
console.log(buf);

五、Buffer的一些常用方法

通過(guò) fill() 以指定的數(shù)據(jù)填充Buffer

let buf = Buffer.alloc(12);
console.log(buf);
//參數(shù)一表示用來(lái)填充的值
//參數(shù)二表示開(kāi)始的偏移量
//參數(shù)三表示結(jié)束的偏移量
//參數(shù)四表示字符編碼
//偏移量的計(jì)算是左閉右開(kāi)的區(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);

通過(guò) write() 向Buffer中寫(xiě)入數(shù)據(jù)

let buf = Buffer.alloc(12);
console.log(buf);
//參數(shù)一表示要寫(xiě)入的字符串
//參數(shù)二表示寫(xiě)入的偏移量
//參數(shù)三表示寫(xiě)入的字節(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());

通過(guò) writeInt8() 寫(xiě)入一個(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);
//讀取要與寫(xiě)入的方法一致,不然數(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);
//讀取要與寫(xiě)入的方法一致,不然數(shù)據(jù)會(huì)錯(cuò)亂。
console.log(buf.readInt16LE(0));

通過(guò) 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());

通過(guò) slice() 創(chuàng)建一個(gè)新的Buffer切片,但是內(nèi)存的指向與原Buffer仍然是同一塊內(nèi)存。

let buf = Buffer.alloc(12, 6);
console.log(buf);
//參數(shù)一表示開(kāi)始切片偏移量
//參數(shù)二表示結(jié)束切片偏移量
let buf2 = buf.slice(0, 3);
buf2.fill(9);
console.log(buf);

通過(guò) 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的開(kāi)始偏移量
//參數(shù)三表示,源Buffer的開(kāi)始拷貝偏移量
//參數(shù)四表示,源Buffer的結(jié)束拷貝偏移量
s_buf.copy(t_buf, 0, 0, 6);
console.log(t_buf.toString());

通過(guò) 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')));

通過(guò) Buffer.byteLength() 獲取字符串字節(jié)長(zhǎng)度

console.log(Buffer.byteLength('你好,世界'));

希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論

郴州市| 建湖县| 衡阳县| 清水河县| 云安县| 晋中市| 颍上县| 利川市| 佛学| 乐至县| 南雄市| 迭部县| 西华县| 青河县| 澄城县| 峨边| 海晏县| 彭山县| 贵南县| 托克托县| 永川市| 积石山| 云梦县| 新巴尔虎右旗| 隆尧县| 随州市| 崇礼县| 梅州市| 伽师县| 财经| 惠州市| 玛多县| 西贡区| 曲阳县| 长岛县| 江西省| 江城| 会昌县| 呈贡县| 陇川县| 荣昌县|