您好,登錄后才能下訂單哦!
網(wǎng)絡(luò)的基礎(chǔ)是數(shù)據(jù)的傳輸和處理,Buffer緩沖,在NodeJs中處理二進(jìn)制的數(shù)據(jù),為什么要折騰出一個Buffer呢,因?yàn)镴avaScript字符串是一個utf-8編碼存儲的,處理二進(jìn)制的能力是很弱的,而網(wǎng)絡(luò)層對于不同資源的請求、響應(yīng)甚至是文件都是用二進(jìn)制進(jìn)行交互的,所以NodeJs就有了這么一個接口,專門存放二進(jìn)制的緩存區(qū),并提供了一些方法來對這些緩存區(qū)的數(shù)據(jù)進(jìn)行進(jìn)一步的處理,
Buffer在NodeJs中是可以全局訪問的,同樣用require來引用和加載它;
在Buffer對象與字符串直接相互轉(zhuǎn)化的時候是需要指定編碼格式的,如果不指定;默認(rèn)是按照utf-8的格式進(jìn)行轉(zhuǎn)換的
新版:
之前版本的寫法是:
第二種:傳遞一個size參數(shù) 來表示緩存區(qū)的大小
這種實(shí)例化的方法只是分配了一段內(nèi)存區(qū)間,往里面寫入的內(nèi)容如果超出長度,那么超出長度的部分是不會被緩沖的
例如:
第三種初始化方法:通過數(shù)組
當(dāng)然也可以通過下標(biāo)來取得數(shù)組中的值,如果數(shù)組的值為小數(shù)型,這個時候取下標(biāo)的時候會做取整操作。
作為一種存儲原始數(shù)據(jù)的方法,Buffer不僅能處理jsp連接中發(fā)送和接收的數(shù)據(jù),
也能處理圖像或者是壓縮文件,讀取到二進(jìn)制數(shù)據(jù)甚至是文件系統(tǒng)中的讀寫的數(shù)據(jù),
包括網(wǎng)絡(luò)中的二進(jìn)制數(shù)據(jù)流,只是是NodeJs中能處理的IO操作中移動的數(shù)據(jù)都能用到Buffer
Buffer應(yīng)該怎么用?
Buffer是一個構(gòu)造函數(shù),同時也是一個對象 它里面的屬性有:
poolSize:內(nèi)存載體的容量
靜態(tài)方法
isBuffer:判斷對象是否是buffer類型的對象
compare:用來判斷兩個buffer對象的相對位置,一般用來做字符串的排序
isEncoding:判斷NodeJs是否支持某種編碼,像中文處理只能使用utf-8這種編碼,對于gbk是無法解析的,需要使用第三方庫
concat:用于將幾個buffer對象連接創(chuàng)建為一個新的buffer對象,我們可以手工分配合并的buffer對象的空間大小,如果空間不夠數(shù)據(jù)會被截斷
bytelength:用來獲得指定編碼下字符串所占的字節(jié)數(shù),由于字符串編碼的不同字符串長度和字節(jié)長度也是不一樣的
實(shí)例化之后所具有的能力:
buf.write()
buf.toString()
buf.copy()
更多參考API文檔
buffer | Node.js API 文檔 http://nodejs.cn/api/buffer.html
編碼所使用的場景?
本地需要讀取一個圖片,然后再復(fù)制一張圖片出來,同時再拿到這個圖片的
base64編碼
已百度圖標(biāo)為例:
/** * New node file */ //先拿到fs模塊 var fs = require('fs') //讀出logo數(shù)據(jù),同時創(chuàng)建到一個Buffer對象中 fs.readFile('logo.png', function(err,origin_buffer){ //如果讀取的過程中指定了編碼的話,就不是buffer對象了,而是你指定編碼的那個字符串 //首先判斷是不是buffer console.log(Buffer.isBuffer(origin_buffer)) //寫一個新文件 fs.writeFile('logo_buffer.png', origin_buffer,function(err){ if(err) console.log(err); }) //writeFile如果沒有指定編碼的話,會認(rèn)為是一個utf8編碼的字符串 //基于原始的buffer再創(chuàng)建一個新的buffer對象,通過base64來解碼 //這樣走了彎路 //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'); //判斷兩個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說明我們通過readFile拿到的的確是個buffer對象,
0:說明兩個origin_buffer和decodedImage都是一樣的。
那這個base64編碼我們應(yīng)該怎么應(yīng)用呢?
首先先把base64轉(zhuǎn)碼,通過
data::p_w_picpath/png;base64,
后面跟上base64編碼字符串
先把src的路徑給清空
再把重新編碼后的字符串粘貼過去
就可以正常顯示圖片了,如圖所示:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。