| Buffer.from() - 创建buffer // 老方法 new Buffer(str, encode);
| toString() - Buffer转字符串
| length - 返回Buffer的长度
| concat([buf1, buf2], 输出的长度) - 合并
| slice(start, end) - 截取
| copy(buffer, 开始目标位置, start, end) - 拷贝
| compare() - 比较两个buffer的大小
| fill() - 用指定的值填充Buffer
| indexOf(val) - 返回指定字符所在Buffer的位置
| lastIndexOf() - 从后向前查找
| includes(val, begin, uncode) - 查找是否存在
| keys() - 获取
| write() - 向指定的buffer写入内容
|
| Buffer.isBuffer(buf) - 是否是一个buffer
| Buffer.isEncoding(‘utf-8’) - 检测是否是一个有效的编码
| Buffer.byteLength - 判断字符的长度

Buffer

Buffer用于创建存放和处理二进制数据的缓存区,buffer是全局不需要require('buffer')

网络上发送和接收经常是以二进制传输数据:

    - 通过TCP连接发送和接收数据;
    - 从图像或者压缩文件读取二进制数据;
    - 从文件系统读写数据;
    - 处理来自网络的二进制数据流


1、字节byte: 1个字节等于8位二进制

       位bit: 每位存储0或1,每8位等于一个字节,最大0-255字节

       一个汉字三个字节,其它两个字节


2、Node.js 目前支持的字符编码包括: 

    'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。

    'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。

    'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。

    'ucs2' - 'utf16le' 的别名。

    'base64' - Base64 编码。当从字符串创建 Buffer 时,按照 RFC4648 第 5 章的规定,这种编码也将正确地接受“URL 与文件名安全字母表”。

    'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式(由 IANA 定义在 RFC1345 第 63 页,用作 Latin-1 补充块与 C0/C1 控制码)。

    'binary' - 'latin1' 的别名。

    'hex' - 将每个字节编码为两个十六进制字符。

new Buffer

new Buffer(size): 创建一个Buffer对象, 并返回一个数组

Buffer创建的三种类型:

    1、new Buffer(2)            // 创建buffer的长度

        let buf = new Buffer(2);
        buf[1] = '232';
        buf[2] = '2312';
        buf[3] = 'asasdf';
        console.log('输出buffer: ', buf);        // 输出buffer:  <Buffer 00 e8>  只能输出两个字节

    2、new Buffer(数组)            // new Buffer([1,3,5])

    3、new Buffer(字符串)        // new Buffer('我')

字符串与buffer互转

1、字符串转buffer

    let buf = new Buffer('sss')
    console.log(buf);            // <Buffer 73 73 73>


2、toString(编码, 获取开始位置 , 获取结束位置): buffer转换成字符串

    let buf = Buffer.from('sss');
    console.log(buf);            // Buffer e7 be 8e e5 a5 bd  输出的6个字符
    console.log(buf.length);    // 6 buffer的长度
    console.log('输出buffer: ', buf.toString('utf-8', 3, 6));    // 输出好     

length 获取长度

let buf = new Buffer('sssss');
console.log(buf.length);     // 5

concat([ 要合并的数据集合 ], 要输出的长度): 合并

let buf1 = new Buffer('忍');
let buf2 = new Buffer('者');
let buf3 = new Buffer('神');
let buf4 = new Buffer('龟');

let newBuf = Buffer.concat([buf1, buf2, buf3, buf4]);
console.log(newBuf);                // 12字节
console.log(newBuf.toString());     // 输出忍者神龟

slice(start, end): 截取

let buf = new Buffer('怎么来截取buffer中的字符');
console.log(buf.slice(9, 15).toString());        // 返回 截取

copy(buffer, 开始目标位置, start, end): 拷贝

let buf = new Buffer('怎么来截取buffer中的字符');
let copyBuf = new Buffer(9);
buf.copy(copyBuf, 6, 0, 9);     // 从buf的第六个字节开始,0到9字符copy

console.log(copyBuf.toString());        // 输出 来截取

Buffer.byteLength: 判断字符的长度

toString() Buffer转字符串

toString([字符编码], [开始转换位置], [结束转换位置])

let buf = new Buffer('哈哈哈');
console.log(buf.toString('utf8'));        // urt8输出为 哈哈哈

可以转换成:  ascii、utf8、utf16le、ucs2、base64

compare() 比较buffer

返回比较结果: 0 两个buffer相等, -1 前者小于后者, 1 前者大于后者

const bufA = new Buffer('123345');
const bufB = new Buffer('123345aaaaa');
const result = bufA.compare(bufB);

switch(result){
    case -1: 
        console.log(`bufA 小于 bufB`);
        break;

    case 0: 
        console.log(`bufA 等于 bufB`);
        break;

    case 1: 
        console.log(`bufA 大于 bufB`);
        break;

    default: break;
}

fill() 用指定的值来填充Buffer

fill(val,[offset], [end], [encode]): 用指定的值来填充Buffer

Example:
    let buf = new Buffer(5);    
    buf.fill('#');
    console.log(buf);

/** 查找与搜索 */

indexOf() 返回指定字符所在Buffer的位置

let buf = new Buffer('aabbbccc');
console.log(buf.indexOf('b'));      // 返回2 如果不存在返回-1

lastIndexOf() 从尾查找所在的位置

includes(val) 返回指定字符是否存在

includes(搜索的值, [buf开始搜索的位置], [搜索的编码])

Example:
    let buf = new Buffer('aaabbbcccddd');
    console.log(buf.includes('b', 2));     // true 或  false

keys() 把buffer中的数组下标

const buf = new Buffer('buffer');
console.log(buf)

for(const key of buf.keys()){
    console.log(key);            // 0、1、2、3、4、5
}

write() 将值写入到buffer的指定位置

write(string, [写入的位置], [写入的字节], [字符编码])

Buffer.isBuffer() 判断是否是Buffer

let str = '';
let buf = new Buffer(10);
console.log(Buffer.isBuffer(str));      // false
console.log(Buffer.isBuffer(buf));      // true

Buffer.isEncoding(endcode): 判断编码