Buffer爲何會這麼有意思?

應用程序在處理像TCP流或文件流時,必須使用二進制數據。Node.js經過Buffer類來處理:html

處理文件流

假設咱們已經有一個文本文件test.txt,咱們使用readFile讀取該文件webpack

const fs = require('fs');
fs.readFile('./test.txt', (err, data) => {
    if (err) throw err;
    console.log(data);
    console.log(Buffer.isBuffer(data));
})
複製代碼

咱們直接打印出data,能夠看到控制檯輸出相似<Buffer 2f 2f 20 4e 6f ... >,使用Buffer.isBuffer()判斷data是否繼承自Buffer類能夠獲得結果爲trueweb

處理TCP流

const https = require('https');
const url = 'https://b-gold-cdn.xitu.io/v3/static/img/frontend.1dae74a.png';
https.get(url, res => {
    var buf = [];
    res.on('data', (chunk) => {
        console.log(Buffer.isBuffer(chunk));
        console.log(chunk);
        buf.push(Buffer.from(chunk));
    })
    res.on('end', () => {
        fs.writeFileSync('./demo.png', Buffer.concat(buf));
    })
})
複製代碼

咱們使用https.get請求一個圖片地址,在回調函數中監聽data事件,咱們能夠看到Buffer.isBuffer(chunk)每次的輸出結果都是true。bash

除了處理上面到兩種狀況,咱們還能夠用Buffer作哪些有意思到事情呢?frontend

咱們來了解一個概念,data URLs

Data URLs,即前綴爲data:協議的URL,其容許內容建立者向文檔中嵌入小文件。 Data URLs 由四個部分組成:前綴(data:)、指示數據類型的MIME類型、若是非文本則爲可選的base64標記、數據格式:data:[<mediatype>][;base64],<data>。 二進制文件能夠使用base64編碼以data URIs的方式呈現。函數

利用data URLs處理圖片文件

const fs = require('fs');
var mime = 'image/png';
var encoding = 'base64';
var uri = 'data:' + mime + ';' + encoding + ',';
var data = fs.readFileSync('./demo.png').toString(encoding);
var uri = 'data:' + '[charset='+mime+']' + ';' + encoding + ',' + data;
console.log(uri);
複製代碼

能夠看到打印出相似以下的字符串: data:[charset=image/png];base64,iVBORw0KGgoAAAANSUhEUgAAA8EAAAMhCAIAAABHbiTVAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR42uzdfWwc550n+K88S1HDmKwOTEGi6FG3ZcEicYi7BMmSsIDcRUVZa+E4LOpuZp...FPn/wPiXQKZbxliAgAAAABJRU5ErkJggg==ui

是否是感受有點熟悉?咱們使用webpack作構建的時候,常常將小圖片轉換成base64編碼內嵌在html中,咱們上面就是在作這個操做。編碼

咱們新建一個html,並建立一個img標籤,將打印的內容複製到img標籤的src屬性中,打開html就能夠看到圖片正常顯示了。反之,若是咱們只有編碼後的字符串,怎麼將其轉換爲.png或.jpg的圖片格式呢,以下:url

var uri='data:[charset=image/png];base64,iVBORw0KGgoAAAANSUhEUgAAA8EAAAMhCAIAAABHbiTVAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR42uzdfWwc550n+K88S1HDmKwOTEGi6FG3ZcEicYi7BMmSsIDcRUVZa+E4LOpuZp...FPn/wPiXQKZbxliAgAAAABJRU5ErkJggg==';
var data = uri.split(',')[1];//提取出數據部分
var buf = Buffer.from(data, 'base64');
fs.writeFileSync('./test.png', buf);
複製代碼

咱們利用Buffer.from方法,指定編碼格式就能夠獲得相應的數據流,將流寫入格式文件就能夠達到目的spa

相關文章
相關標籤/搜索