> 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);
```
- 简介
- 配置安装
- window
- 基础知识
- Node 命令基本用法
- 进程和线程
- 调试
- 异步、回调
- 全局对象
- 非阻塞 I/O和事件驱动和非阻塞机制
- npm包概念
- 模块化
- 实现require和cache
- 核心模块操作
- fs文件系统操作
- 同步调用和异步调用
- 缓冲区处理(二进制数据)
- 文件读取
- 文件写入
- 例子:读取歌词文件显示
- 文件流
- 例子:文件复制
- 监视文件
- 其他文件操作
- 目录操作
- 例子:递归加载目录树
- path路径操作模块
- 网络操作
- URL 解析模块
- querystring查询字符串模块
- crypto加密解密模块
- Socket
- 例子:聊天室
- coffeescript
- Gulp-自动化构建工具
- Gulp实现前端构建
- Gulp后端构建
- 插件
- gulp-load-plugins 模块化管理插件
- gulp-minify-css 压缩css插件
- gulp-sass 将sass预处理为css
- gulp-less 将less预处理为css
- gulp-sourcemaps 插件
- gulp-concat 合并插件
- gulp-uglify 压缩JS插件
- gulp-util gulp常用工具库插件
- yargs插件
- gulp-nodemon 自动启动/重启插件
- coffee-script 插件
- gulp-coffee插件
- gulp-livereload 网页自动刷新
- Moment.js-处理时间插件
- express 前端框架
- Async-异步流程控制插件
- node-progress进度条插件
- JSHint-代码规范检查工具
- lodash -JavaScript 工具库
- 资料
- 框架所用包
- bodyParser
