日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

node MySQL buffer_node.js中buffer方法使用说明

發(fā)布時(shí)間:2025/3/20 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node MySQL buffer_node.js中buffer方法使用说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

熟悉JavaScript的童鞋應(yīng)該對(duì)Node.js都不陌生,沒(méi)錯(cuò)Node.js是一個(gè)基于Chrome?JavaScript運(yùn)行時(shí)建立的平臺(tái),用于方便地搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。Node.js?使用事件驅(qū)動(dòng),?非阻塞I/O?模型而得以輕量和高效,非常適合在分布式設(shè)備上運(yùn)行數(shù)據(jù)密集型的實(shí)時(shí)應(yīng)用。

正是由于Node.js的這些特性使得其在如今的編程中越來(lái)越受歡迎,對(duì)于新手程序猿來(lái)說(shuō)很有必要掌握Node.js技術(shù)。本文小編就將為大家介紹Node.js中Buffer類的使用,希望對(duì)大家學(xué)習(xí)Node.js有幫助吧。

其實(shí),Buffer類在Node.js的使用中,經(jīng)常會(huì)用到,特別是在用Node.js做服務(wù)端開發(fā)時(shí),http、tcp、udp、文件io等等類型的操作,都離不開Buffer類。

Buffer是什么

Buffer代表一個(gè)緩沖區(qū),存儲(chǔ)二進(jìn)制數(shù)據(jù),是字節(jié)流,在網(wǎng)絡(luò)傳輸時(shí),就傳輸?shù)倪@種字節(jié)流。

編碼格式

雖然一般的字符串是有編碼格式的,比如UTF-8。但Buffer是沒(méi)有編碼格式的。兩者可以相互轉(zhuǎn)換,轉(zhuǎn)換時(shí)必須指定編碼格式。

在http模塊中,http.createServer方法需要的回調(diào)函數(shù)的原型是:

function?(req,?res)

這個(gè)回調(diào)的第一個(gè)參數(shù),req,類型是http.IncomingMessage,而http.IncomingMessage是一個(gè)只讀的流,實(shí)現(xiàn)了Readable接口,stream.Readable讀到的數(shù)據(jù)(監(jiān)聽data事件可以處理),就是Buffer對(duì)象,是字節(jié)流。而我們?cè)诔绦蛑惺褂脮r(shí),經(jīng)常是要轉(zhuǎn)換為String。反過(guò)來(lái),res(類型http.ServerResponse,可寫的流,實(shí)現(xiàn)了Writable接口)有個(gè)方法setDefaultEncoding,用來(lái)設(shè)置流的編碼格式,在write數(shù)據(jù)時(shí),會(huì)使用指定的編碼格式來(lái)編碼數(shù)據(jù),然后發(fā)送給客戶端。

這就是說(shuō),網(wǎng)絡(luò)傳輸?shù)氖荁uffer,程序需要處理String,Buffer和String之間可以轉(zhuǎn)換。Buffer有toString方法,可以按指定的編碼格式將字節(jié)流轉(zhuǎn)換為String。

在文件系統(tǒng)模塊中,fs.createWriteStream和fs.createReadStream兩個(gè)方法都有一個(gè)可選參數(shù)options,可以指定defaultEncoding,這里指定的編碼格式,也是用于在Buffer和String之間轉(zhuǎn)換的。

目前我們?cè)贜ode.js里,Buffer在轉(zhuǎn)換為字符串時(shí),toString方法的第一個(gè)參數(shù)就是編碼類型,支持常見的編碼格式:

utf8,多字節(jié)編碼的Unicode字符,大多數(shù)文檔和網(wǎng)頁(yè)采用這種編碼格式

ascii,8bit編碼,一個(gè)字符占1個(gè)字節(jié)

utf16le,小端編碼的unicode字符

utf16be,大端編碼的unicode

ucs2,unicode編碼,每個(gè)字符占兩個(gè)字節(jié)

base64,Base-64字符串編碼

hex,每個(gè)字節(jié)編碼為兩個(gè)十六進(jìn)制字符

假如你不確認(rèn)某個(gè)編碼格式是否正確,可以使用Buffer.isEncoding(encoding)方法來(lái)測(cè)試。

在使用Buffer的toString方法時(shí),如果你不指定編碼格式,則默認(rèn)使用utf8來(lái)轉(zhuǎn)換。toString原型:

buf.toString([encoding][,?start][,?end])

第一個(gè)參數(shù)是編碼格式,第二個(gè)是開始位置(0到buf.length-1),第三個(gè)是結(jié)束位置(不包含這個(gè)索引位置的數(shù)據(jù))。

創(chuàng)建一個(gè)Buffer實(shí)例

對(duì)于Buffer實(shí)例的創(chuàng)建,使用new操作符,有四種方法可實(shí)現(xiàn):

new?Buffer(size),創(chuàng)建一個(gè)指buffer定大小的buffer

new?Buffer(array),根據(jù)一個(gè)字節(jié)數(shù)組來(lái)創(chuàng)建一個(gè)buffer

new?Buffer(str[,encoding]),根據(jù)一個(gè)字符串和編碼格式創(chuàng)建buffer,不指定編碼時(shí)默認(rèn)使用utf8

new?Buffer(buffer),根據(jù)buffer實(shí)例創(chuàng)建一個(gè)新的buffer

比如下面的代碼可以創(chuàng)建Buffer的實(shí)例:

var?buf1?=?new?Buffer(256);

var?buf2?=?new?Buffer("Hello?Buffer");

var?buf3?=?new?Buffer([0x65,0x66,0x67]);

var?buf4?=?new?Buffer(buf2);

但有一點(diǎn)需要說(shuō)明的是,使用new?Buffer(size)分配的緩沖區(qū),是未初始化的。那塊內(nèi)存里,可能什么都有。試試下面的代碼:

var?buf1?=?new?Buffer(256);

buf1.write('abc');

console.log("buf1\'s?content:?",?buf1.toString());

上面的代碼企圖使用toString轉(zhuǎn)換Buffer,可是你會(huì)看到控制臺(tái)輸出了很多亂碼……修改一下,使用buf.fill()方法填充一下就好了:

var?buf1?=?new?Buffer(256);

buf1.fill(0);

buf1.write('abc');

console.log("buf1\'s?content:?",?buf1.toString());

字符串是“\0”結(jié)尾的,調(diào)用了buf1.fill(0)之后,就一切安好。

往緩沖區(qū)寫數(shù)據(jù)

前面我們已經(jīng)使用了buf.write方法來(lái)向緩沖區(qū)里寫入數(shù)據(jù)了。write的原型如下:

buf.write(string[,?offset][,?length][,?encoding])

buf.write用來(lái)向緩沖區(qū)中寫入一個(gè)字符串,返回實(shí)際寫入的字節(jié)數(shù)。參數(shù)含義如下:

string,待寫入的字符串對(duì)象

offset,緩沖區(qū)偏移量,指定的話就從這個(gè)位置開始寫入,不指定就默認(rèn)為0

length,要寫入的字節(jié)數(shù)

encoding,代謝如字符串的編碼格式,默認(rèn)為utf8

Buffer還有很多其他的方法,讓你操作緩沖區(qū)。比如writeUInt8、writeUInt16LE、writeUInt16BE、writeUInt31LE、writeUInt32BE、writeInt8、writeInt16LE、writeInt32LE等等。

LE?-?little?endian,小端字節(jié)序。

BE?-?big?endian,大端字節(jié)序,即網(wǎng)絡(luò)字節(jié)序。

需要說(shuō)明的是,writeX方法,不像文件一樣自動(dòng)為你保存當(dāng)前位置,你不指定offset,它就總是從0位置開始寫。

從緩沖區(qū)讀數(shù)據(jù)

buf.toString其實(shí)是一種讀數(shù)據(jù)的方式。當(dāng)然,還有其它的,比如buf[index]可以根據(jù)下標(biāo)讀取字節(jié),buf.readIntXXX,buf.readUIntXXX……

buf.toJSON()可以把一個(gè)Buffer對(duì)象轉(zhuǎn)換為JSON格式。當(dāng)你針對(duì)一個(gè)Buffer對(duì)象調(diào)用JSON.stringify方法時(shí),buf.toJSON()就會(huì)被調(diào)用。比如:

var?buf?=?new?Buffer('test');

var?json?=?JSON.stringify(buf);

console.log(json);

//?'{"type":"Buffer","data":[116,101,115,116]}'

緩沖區(qū)的長(zhǎng)度

一個(gè)Buffer對(duì)象的大小,在創(chuàng)建時(shí)就固定下來(lái),創(chuàng)建之后不可改變。如果你覺(jué)得Buffer里保存的是字符串時(shí),不妨可以試試下面的代碼有助于理解這一點(diǎn):

var?buf1?=?new?Buffer(256);

buf1.fill(0);

buf1.write('abc');

console.log("buf1\'s?length?-?%d,?not?3\n",?buf1.length);

buf1.write('abcdef');

console.log("buf1\'s?length?-?%d,?not?6\n",?buf1.length);

另外當(dāng)你要從確定字符串在緩沖區(qū)中占用的字節(jié)長(zhǎng)度時(shí),不能使用字符串的length屬性,因?yàn)镾tring.length返回的是字符長(zhǎng)度。而對(duì)于采用UTF8等編碼格式編碼的字符串,一個(gè)字符可能占用多個(gè)字節(jié)。所以,String.length所代表的字符串長(zhǎng)度和字節(jié)長(zhǎng)度就不一致。注意,Buffer.length返回的是緩沖區(qū)的字節(jié)長(zhǎng)度,而且是創(chuàng)建時(shí)的那個(gè)長(zhǎng)度,不會(huì)隨著緩沖內(nèi)容變化而變化。

如果要想衡量一個(gè)字符串占用的字節(jié)長(zhǎng)度,可以使用Buffer.byteLength(string[,encoding])這個(gè)方法,它會(huì)測(cè)量一個(gè)字符串在指定編碼格式下占用的字節(jié)長(zhǎng)度。具體的,可以看看下面這個(gè)例子:

var?name?=?new?String('who?is?\u5F20\u4E09\u4E30?');

console.log('name.length?=?%d',?name.length);

console.log('byteLength?=?%d',?Buffer.byteLength(name,?'utf8'));

緩沖區(qū)操作

Buffer還支持切片、拷貝、拼接、比較等操作。

buf.slice([start[,?end]])可以根據(jù)起止位置(不包含結(jié)束位置對(duì)應(yīng)的數(shù)據(jù))對(duì)一個(gè)緩沖區(qū)進(jìn)行切片,返回一個(gè)新的Buffer對(duì)象,方便我們操作緩沖區(qū)的某個(gè)區(qū)域。但值得注意的是,這個(gè)切片是對(duì)原有緩沖區(qū)的引用,而不是副本,你對(duì)切片內(nèi)容的修改,實(shí)際上修改的是原始的緩沖區(qū)。這個(gè)方法返回一個(gè)代表切片的Buffer對(duì)象。

buf.copy(targetBuffer[,?targetStart][,?sourceStart][,?sourceEnd])可以將一個(gè)緩沖區(qū)指定區(qū)域的內(nèi)容拷貝到另一個(gè)緩沖的指定區(qū)域。類似C語(yǔ)言里的memcpy。targetStart指定目標(biāo)緩沖區(qū)的起始偏移,sourceStart指定源緩沖區(qū)的起始偏移,它們默認(rèn)都是0;sourceEnd指定源緩沖區(qū)的結(jié)束位置,默認(rèn)是源緩沖區(qū)的長(zhǎng)度。實(shí)際復(fù)制時(shí),會(huì)比較目標(biāo)緩沖區(qū)的長(zhǎng)度和待復(fù)制區(qū)域的長(zhǎng)度,哪個(gè)小按哪個(gè)來(lái),不會(huì)越界。

Buffer有一個(gè)類方法,concat(list[,totalLength]),可以將一串緩沖區(qū)拼接成一個(gè)。第一個(gè)參數(shù)list是一個(gè)緩沖區(qū)數(shù)組,第二是待拼接的緩沖區(qū)的總長(zhǎng)度。如果你不提供totalLength,concat會(huì)自己遍歷list中的緩沖區(qū)計(jì)算總長(zhǎng)度,會(huì)有一點(diǎn)性能損失。這個(gè)方法返回拼接后的緩沖區(qū)。

看個(gè)示例代碼,演示切片、拷貝和拼接的用法:

var?buf1?=?new?Buffer('1234');

var?buf2?=?new?Buffer('12567');

var?bufList?=?[buf1,?buf2];

var?buf3?=?Buffer.concat(bufList);

console.log('buf3?-?%s',?buf3.toString());

var?buf4?=?buf3.slice(3,?8);

console.log('buf4?-?%s',?buf4.toString());

var?buf5?=?new?Buffer(5);

buf3.copy(buf5,?0,?1);

console.log('buf5?-?%s',?buf5.toString());

buf.equals(otherBuffer)判斷當(dāng)前緩沖區(qū)是否和另一個(gè)相等,相等時(shí)返回true。

buf.compare(otherBuffer)比較當(dāng)前緩沖區(qū)和另一個(gè)緩沖區(qū)的大小,相等返回0,小于返回-1,大于返回1。看下面的示例代碼:

var?buf1?=?new?Buffer('1234');

var?buf2?=?new?Buffer('12567');

var?buf3?=?new?Buffer('1234');

var?buf4?=?new?Buffer('0123');

console.log('buf1.compare(buf2)?=?',?buf1.compare(buf2));

console.log('buf1.compare(buf3)?=?',?buf1.compare(buf3));

console.log('buf1.compare(buf4)?=?',?buf1.compare(buf4));

以上就是Node.js中Buffer類的一些相關(guān)用法,大家在學(xué)習(xí)Node.js時(shí),可嘗試開發(fā)一個(gè)小項(xiàng)目將上面這些方法都動(dòng)手使用、實(shí)踐一遍,加深印象,以便今后開發(fā)中,遇到類似功能信手捏來(lái)。

總結(jié)

以上是生活随笔為你收集整理的node MySQL buffer_node.js中buffer方法使用说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。