網(wǎng)絡(luò)的基礎(chǔ)是數(shù)據(jù)的傳輸和處理,Buffer緩沖,在NodeJs中處理二進(jìn)制的數(shù)據(jù),為什么要折騰出一個(gè)Buffer呢,因?yàn)镴avaScript字符串是一個(gè)utf-8編碼存儲(chǔ)的,處理二進(jìn)制的能力是很弱的,而網(wǎng)絡(luò)層對(duì)于不同資源的請(qǐng)求、響應(yīng)甚至是文件都是用二進(jìn)制進(jìn)行交互的,所以NodeJs就有了這么一個(gè)接口,專門(mén)存放二進(jìn)制的緩存區(qū),并提供了一些方法來(lái)對(duì)這些緩存區(qū)的數(shù)據(jù)進(jìn)行進(jìn)一步的處理,
大洼網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),大洼網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為大洼千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的大洼做網(wǎng)站的公司定做!
Buffer在NodeJs中是可以全局訪問(wèn)的,同樣用require來(lái)引用和加載它;
在Buffer對(duì)象與字符串直接相互轉(zhuǎn)化的時(shí)候是需要指定編碼格式的,如果不指定;默認(rèn)是按照utf-8的格式進(jìn)行轉(zhuǎn)換的
新版:

之前版本的寫(xiě)法是:

第二種:傳遞一個(gè)size參數(shù) 來(lái)表示緩存區(qū)的大小

這種實(shí)例化的方法只是分配了一段內(nèi)存區(qū)間,往里面寫(xiě)入的內(nèi)容如果超出長(zhǎng)度,那么超出長(zhǎng)度的部分是不會(huì)被緩沖的
例如:

第三種初始化方法:通過(guò)數(shù)組
當(dāng)然也可以通過(guò)下標(biāo)來(lái)取得數(shù)組中的值,如果數(shù)組的值為小數(shù)型,這個(gè)時(shí)候取下標(biāo)的時(shí)候會(huì)做取整操作。

作為一種存儲(chǔ)原始數(shù)據(jù)的方法,Buffer不僅能處理jsp連接中發(fā)送和接收的數(shù)據(jù),
也能處理圖像或者是壓縮文件,讀取到二進(jìn)制數(shù)據(jù)甚至是文件系統(tǒng)中的讀寫(xiě)的數(shù)據(jù),
包括網(wǎng)絡(luò)中的二進(jìn)制數(shù)據(jù)流,只是是NodeJs中能處理的IO操作中移動(dòng)的數(shù)據(jù)都能用到Buffer
Buffer應(yīng)該怎么用?
Buffer是一個(gè)構(gòu)造函數(shù),同時(shí)也是一個(gè)對(duì)象 它里面的屬性有:
poolSize:內(nèi)存載體的容量
靜態(tài)方法
isBuffer:判斷對(duì)象是否是buffer類型的對(duì)象
compare:用來(lái)判斷兩個(gè)buffer對(duì)象的相對(duì)位置,一般用來(lái)做字符串的排序
isEncoding:判斷NodeJs是否支持某種編碼,像中文處理只能使用utf-8這種編碼,對(duì)于gbk是無(wú)法解析的,需要使用第三方庫(kù)
concat:用于將幾個(gè)buffer對(duì)象連接創(chuàng)建為一個(gè)新的buffer對(duì)象,我們可以手工分配合并的buffer對(duì)象的空間大小,如果空間不夠數(shù)據(jù)會(huì)被截?cái)?/p>
bytelength:用來(lái)獲得指定編碼下字符串所占的字節(jié)數(shù),由于字符串編碼的不同字符串長(zhǎng)度和字節(jié)長(zhǎng)度也是不一樣的
實(shí)例化之后所具有的能力:
buf.write()
buf.toString()
buf.copy()
更多參考API文檔
buffer | Node.js API 文檔 http://nodejs.cn/api/buffer.html
編碼所使用的場(chǎng)景?
本地需要讀取一個(gè)圖片,然后再?gòu)?fù)制一張圖片出來(lái),同時(shí)再拿到這個(gè)圖片的
base64編碼
已百度圖標(biāo)為例:
/**
* New node file
*/
//先拿到fs模塊
var fs = require('fs')
//讀出logo數(shù)據(jù),同時(shí)創(chuàng)建到一個(gè)Buffer對(duì)象中
fs.readFile('logo.png', function(err,origin_buffer){
//如果讀取的過(guò)程中指定了編碼的話,就不是buffer對(duì)象了,而是你指定編碼的那個(gè)字符串
//首先判斷是不是buffer
console.log(Buffer.isBuffer(origin_buffer))
//寫(xiě)一個(gè)新文件
fs.writeFile('logo_buffer.png', origin_buffer,function(err){
if(err) console.log(err);
})
//writeFile如果沒(méi)有指定編碼的話,會(huì)認(rèn)為是一個(gè)utf8編碼的字符串
//基于原始的buffer再創(chuàng)建一個(gè)新的buffer對(duì)象,通過(guò)base64來(lái)解碼
//這樣走了彎路
//var base64Image = new Buffer(origin_buffer).toString('base64');
var base64Image = origin_buffer.toString('base64')
//打印base64的值
console.log(base64Image);
//把base64Image穿入?yún)?shù)
var decodedImage = new Buffer(base64Image, 'base64');
//判斷兩個(gè)buffer是不是一樣的
console.log(Buffer.compare(origin_buffer,decodedImage));
fs.writeFile('logo_decoded.png',decodedImage,function(err){
if(err) console.log(err);
})
})運(yùn)行結(jié)果如圖所示:

true說(shuō)明我們通過(guò)readFile拿到的的確是個(gè)buffer對(duì)象,
0:說(shuō)明兩個(gè)origin_buffer和decodedImage都是一樣的。
那這個(gè)base64編碼我們應(yīng)該怎么應(yīng)用呢?
首先先把base64轉(zhuǎn)碼,通過(guò)
data::p_w_picpath/png;base64,
后面跟上base64編碼字符串
先把src的路徑給清空
再把重新編碼后的字符串粘貼過(guò)去
就可以正常顯示圖片了,如圖所示:

分享題目:Node.js(十四)——Net模塊之Buffer
路徑分享:http://www.chinadenli.net/article26/gccdcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站排名、小程序開(kāi)發(fā)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)