ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> https://0532.gitbooks.io/nodejs/content/buffers/README.html > buffer API https://nodejs.org/api/buffer.html >参考:http://blog.fens.me/nodejs-buffer/ ##什么是缓冲区 - 缓冲区就是内存中操作数据的容器 - 只是数据容器而已 - 通过缓冲区可以很方便的操作二进制数据 - 而且在大文件操作时必须有缓冲区 ##为什么要有缓冲区 - JS 是比较擅长处理字符串,但是早期的应用场景主要用于处理 HTML 文档,不会有太大篇幅的数据处理,也不会接触到二进制的数据。 - 而在 Node 中操作数据、网络通信是没办法完全以字符串的方式操作的,简单来说 - 所以在 Node 中引入了一个二进制的缓冲区的实现:Buffer ##缓冲区操作 - 创建长度为4个字节的缓冲区 ``` var buffer = new Buffer(4); ``` - 通过指定数组内容的方式创建 ``` var buffer = new Buffer([00,01]); ``` - 通过指定编码的方式创建 ``` var buffer = new Buffer('hello', 'utf8'); ``` ##例子 buf.write(string[, offset[, length]][, encoding]) write写入的是字符串 有offset偏移,如果不指定,每次写,都是从头写。 .toString('utf8') 以文本方式读 其他: [大端、小端的区别(BIG-ENDIAN OR LITTLE-ENDIAN)](http://smilejay.com/2012/01/big-endian_little-endian/) - buf.write(string[, offset[, length]][, encoding]) - buf.writeDoubleBE(value, offset[, noAssert]) - buf.writeDoubleLE(value, offset[, noAssert]) - buf.writeFloatBE(value, offset[, noAssert]) - buf.writeFloatLE(value, offset[, noAssert]) - buf.writeInt8(value, offset[, noAssert]) - buf.writeInt16BE(value, offset[, noAssert]) - buf.writeInt16LE(value, offset[, noAssert]) - buf.writeInt32BE(value, offset[, noAssert]) - buf.writeInt32LE(value, offset[, noAssert]) - buf.writeIntBE(value, offset, byteLength[, noAssert]) - buf.writeIntLE(value, offset, byteLength[, noAssert]) - buf.writeUInt8(value, offset[, noAssert]) - buf.writeUInt16BE(value, offset[, noAssert]) - buf.writeUInt16LE(value, offset[, noAssert]) - buf.writeUInt32BE(value, offset[, noAssert]) - buf.writeUInt32LE(value, offset[, noAssert]) - buf.writeUIntBE(value, offset, byteLength[, noAssert]) - buf.writeUIntLE(value, offset, byteLength[, noAssert]) 例子1: ```js // 读取文件 const fs = require('fs'); const path = require('path'); // 读取文件时没有指定编码默认读取的是一个Buffer(缓冲区) // readFile的方式确实是使用buffer,但是也是一次性读取 fs.readFile(path.join(__dirname, './../README.md'), (error, data) => { console.log(data.toString('utf8')); }); ``` 例子2: ```js var buffer = new Buffer(4); buffer.write('sssssssss'); console.log(buffer.toString('utf8')); ``` 结果 ``` ssss ``` 例子3: ```js var buffer = new Buffer(4); buffer.write('12'); console.log(buffer.toString('utf8')); console.log(buffer.toString('utf8', 0, 2)); console.log(buffer.toString('utf8', 0, 1)); //offset buffer.write('77'); buffer.write('88', 2); console.log(buffer.toString('utf8')); ``` 结果 进行了补位 ``` 12� 12 1 7788 ``` 例子4: init32和int16的值范围 ``` // -272323123 <= int32 < 27120832109 // -272323123 <= int16 < 27120832109 ``` ##应用(读取图片,转成bash64) ``` // 读取图片 const fs = require('fs'); const path = require('path'); fs.readFile(path.join(__dirname, './../img/google.png'), (error, data) => { console.log(data.toString('base64')); }); ``` [DataURI详解](http://aiyouu.net/data-uris-explained/) ``` data:image.png;bash64,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ``` ##Node 默认支持的编码 Buffers 和 JavaScript 字符串对象之间转换时需要一个明确的编码方法。下面是字符串的不同编码。 - 'ascii' - 7位的 ASCII 数据。这种编码方式非常快,它会移除最高位内容。 - 'utf8' - 多字节编码 Unicode 字符。大部分网页和文档使用这类编码方式。 - 'utf16le' - 2个或4个字节, Little Endian (LE) 编码 Unicode 字符。编码范围 (U+10000 到 U+10FFFF) 。 - 'ucs2' - 'utf16le'的子集。 - 'base64' - Base64 字符编码。 - 'binary' - 仅使用每个字符的头8位将原始的二进制信息进行编码。在需使用 Buffer 的情况下,应该尽量避免使用这个已经过时的编码方式。这个编码方式将会在未来某个版本中弃用。 - 'hex' - 每个字节都采用 2 进制编码。 默认不支持GBK 使用 iconv-lite插件 提供编码转换 > https://www.npmjs.com/package/iconv-lite [Node.js 处理 GBK 编码模板](https://cnodejs.org/topic/5305b6ac6c0325e501326545) **例子** ```js // 解决GBK编码支持问题 // 所有的文件操作全部基于FS模块 const fs = require('fs'); // 无论是同步操作还是异步操作都“必须使用”绝对路径的形式操作 const path = require('path'); // 将文本读取到一个buffer中 const buffer = fs.readFileSync(path.join(__dirname, '../lyrics/友谊之光.lrc')); // 由于Windows下文件默认编码为GBK所以需要通过 const iconv = require('iconv-lite'); const content2 = iconv.decode(buffer,'gbk'); console.log(content2); ```