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

相关文章
相关标签/搜索