網絡的基礎是數據的傳輸和處理,Buffer緩衝,在NodeJs中處理二進制的數據,爲何要折騰出一個Buffer呢,由於JavaScript字符串是一個utf-8編碼存儲的,處理二進制的能力是很弱的,而網絡層對於不一樣資源的請求、響應甚至是文件都是用二進制進行交互的,因此NodeJs就有了這麼一個接口,專門存放二進制的緩存區,並提供了一些方法來對這些緩存區的數據進行進一步的處理,html
Buffer在NodeJs中是能夠全局訪問的,一樣用require來引用和加載它;node
在Buffer對象與字符串直接相互轉化的時候是須要指定編碼格式的,若是不指定;默認是按照utf-8的格式進行轉換的api
新版:數組
以前版本的寫法是:緩存
第二種:傳遞一個size參數 來表示緩存區的大小網絡
這種實例化的方法只是分配了一段內存區間,往裏面寫入的內容若是超出長度,那麼超出長度的部分是不會被緩衝的jsp
例如:ide
第三種初始化方法:經過數組函數
固然也能夠經過下標來取得數組中的值,若是數組的值爲小數型,這個時候取下標的時候會作取整操做。ui
做爲一種存儲原始數據的方法,Buffer不只能處理jsp鏈接中發送和接收的數據,
也能處理圖像或者是壓縮文件,讀取到二進制數據甚至是文件系統中的讀寫的數據,
包括網絡中的二進制數據流,只是是NodeJs中能處理的IO操做中移動的數據都能用到Buffer
Buffer應該怎麼用?
Buffer是一個構造函數,同時也是一個對象 它裏面的屬性有:
poolSize:內存載體的容量
靜態方法
isBuffer:判斷對象是不是buffer類型的對象
compare:用來判斷兩個buffer對象的相對位置,通常用來作字符串的排序
isEncoding:判斷NodeJs是否支持某種編碼,像中文處理只能使用utf-8這種編碼,對於gbk是沒法解析的,須要使用第三方庫
concat:用於將幾個buffer對象鏈接建立爲一個新的buffer對象,咱們能夠手工分配合並的buffer對象的空間大小,若是空間不夠數據會被截斷
bytelength:用來得到指定編碼下字符串所佔的字節數,因爲字符串編碼的不一樣字符串長度和字節長度也是不同的
實例化以後所具備的能力:
buf.write()
buf.toString()
buf.copy()
更多參考API文檔
buffer | Node.js API 文檔 http://nodejs.cn/api/buffer.html
編碼所使用的場景?
本地須要讀取一個圖片,而後再複製一張圖片出來,同時再拿到這個圖片的
base64編碼
已百度圖標爲例:
/** * New node file */ //先拿到fs模塊 var fs = require('fs') //讀出logo數據,同時建立到一個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若是沒有指定編碼的話,會認爲是一個utf8編碼的字符串 //基於原始的buffer再建立一個新的buffer對象,經過base64來解碼 //這樣走了彎路 //var base64Image = new Buffer(origin_buffer).toString('base64'); var base64Image = origin_buffer.toString('base64') //打印base64的值 console.log(base64Image); //把base64Image穿入參數 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); }) })
運行結果如圖所示:
true說明咱們經過readFile拿到的的確是個buffer對象,
0:說明兩個origin_buffer和decodedImage都是同樣的。
那這個base64編碼咱們應該怎麼應用呢?
首先先把base64轉碼,經過
data::p_w_picpath/png;base64,
後面跟上base64編碼字符串
先把src的路徑給清空
再把從新編碼後的字符串粘貼過去
就能夠正常顯示圖片了,如圖所示: