Node.js(十四)——Net模組之Buffer

來源:互聯網
上載者:User

標籤:node.js(十四)——net模組之buffer

網路的基礎是資料的傳輸和處理,Buffer緩衝,在NodeJs中處理二進位的資料,為什麼要折騰出一個Buffer呢,因為JavaScript字串是一個utf-8編碼儲存的,處理二進位的能力是很弱的,而網路層對於不同資源的請求、響應甚至是檔案都是用二進位進行互動的,所以NodeJs就有了這麼一個介面,專門存放二進位的緩衝區,並提供了一些方法來對這些緩衝區的資料進行進一步的處理,

Buffer在NodeJs中是可以全域訪問的,同樣用require來引用和載入它;


在Buffer對象與字串直接相互轉化的時候是需要指定編碼格式的,如果不指定;預設是按照utf-8的格式進行轉換的

新版:

650) this.width=650;" src="https://s1.51cto.com/wyfs02/M00/8F/5A/wKioL1jbnyGzzvnNAABH3ZPyOL8551.jpg" title="36020170315204858576.jpg" alt="wKioL1jbnyGzzvnNAABH3ZPyOL8551.jpg" />

之前版本的寫法是:

650) this.width=650;" src="https://s2.51cto.com/wyfs02/M01/8F/5A/wKioL1jbn1PzQ3PwAAAu74y-a3A858.jpg" title="36020170315204858576.jpg" alt="wKioL1jbn1PzQ3PwAAAu74y-a3A858.jpg" />

第二種:傳遞一個size參數 來表示緩衝區的大小

650) this.width=650;" src="https://s2.51cto.com/wyfs02/M02/8F/5C/wKiom1jbn7TjnadXAAARSjnQa0U895.jpg" title="36020170315204858576.jpg" alt="wKiom1jbn7TjnadXAAARSjnQa0U895.jpg" />

這種執行個體化的方法只是分配了一段記憶體區間,往裡面寫入的內容如果超出長度,那麼超出長度的部分是不會被緩衝的

例如:

650) this.width=650;" src="https://s4.51cto.com/wyfs02/M00/8F/5C/wKiom1jboH7hW8k2AABDcQFEv8s370.jpg" title="36020170315204858576.jpg" alt="wKiom1jboH7hW8k2AABDcQFEv8s370.jpg" />

第三種初始化方法:通過數組

當然也可以通過下標來取得數組中的值,如果數組的值為小數型,這個時候取下標的時候會做取整操作。

650) this.width=650;" src="https://s2.51cto.com/wyfs02/M02/8F/5A/wKioL1jboUfwLFY8AABRtYO2nb8535.jpg" title="36020170315204858576.jpg" alt="wKioL1jboUfwLFY8AABRtYO2nb8535.jpg" />


作為一種儲存未經處理資料的方法,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對象了,而是你指定編碼的那個字串//首先判斷是不是bufferconsole.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);})})

運行結果:

650) this.width=650;" src="https://s2.51cto.com/wyfs02/M02/8F/5E/wKiom1jbzO_gqzkZAAMlSCYuzRU286.jpg" title="36020170315204858576.jpg" alt="wKiom1jbzO_gqzkZAAMlSCYuzRU286.jpg" />

true說明我們通過readFile拿到的的確是個buffer對象,

0:說明兩個origin_buffer和decodedImage都是一樣的。


那這個base64編碼我們應該怎麼應用呢?

首先先把base64轉碼,通過

data::image/png;base64,

後面跟上base64編碼字串

  1. 先把src的路徑給清空

  2. 再把重新編碼後的字串粘貼過去

就可以正常顯示圖片了,:

650) this.width=650;" src="https://s4.51cto.com/wyfs02/M02/8F/5C/wKioL1jbzfHAaR06AADQR9EIcYk474.jpg" title="36020170315204858576.jpg" alt="wKioL1jbzfHAaR06AADQR9EIcYk474.jpg" />

本文出自 “IT菜鳥” 部落格,請務必保留此出處http://mazongfei.blog.51cto.com/3174958/1911576

Node.js(十四)——Net模組之Buffer

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.