/*纯 JavaScript 对 Unicode 友好但是无法很好地处理二进制数据。当我们面对类似 TCP 流或文件系统时,是需要处理八位流的。Node 有几种操作、创建以及消费八位流的策略。*/
/*原始数据保存在 Buffer 类的实例中。一个 Buffer 实例类似于一个整数数组,但对应者 V8 堆之外的一个原始内存分配区域。一个 Buffer 的大小不可变。*/
/*Buffer 类是一个全局的类,所以它很罕有地不需要require语句就可以调用*/
/*在Buffers和JavaScript string转换时,需要明确的一个编码方法。下面是一些不同的string编码*/
/*'ascii' - 仅适用 7 bit ASCII 格式数据。这个编码方式非常快速,而且会剥离设置过高的bit。*/
/*'utf8' - 多字节编码 Unicode字符。很多网页或者其他文档的编码格式都是使用 UTF-8的。*/
/*'utf16le' - 2 或者 4 字节, Little Endian (LE) 编码Unicode字符。代理对 (U+10000 to U+10FFFF) 是支持的.
(BE和LE表示大端和小端,Little-Endian就是低位字节排放在内存的低地址端,
高位字节排放在内存的高地址端;Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端;下同)*/
/*'ucs2' - 'utf16le'的别名.*/
/*'base64' - Base64 字符串编码*/
/*'binary' - 一个将原始2进制数据编码为字符串的方法,仅使用每个字符的前8bits。 这个编码方式已经被弃用而且应该被避免,
尽可能的使用Buffer对象。这个编码方式将会在未来的Node版本中移除。*/
/*'hex' - 把每个byte编码成2个十六进制字符*/
//类
Buffer
//Buffer 类是一个全局变量类型,用来直接处理2进制数据的。 它能够使用多种方式构建。
new Buffer(size);
//创建一个新的buffer, 大小是size的8位字节
//在申请固定字节的空间时,在大小小于8kb的时候,最好声明8的倍数,因为Buffer空间的自动回收是按照8byte的来回收的,参见<a target=_blank href="http://snoopyxdy.blog.163.com/blog/static/601174402013230102139585/">buffer.concat引出的bug</a>
new Buffer(array);
//创建一个buffer, 大小为array数字的8位字节
new Buffer(str, encoding);
//创建一个buffer, str为包含的字符串, encoding为编码方式,默认为'utf8'
//类方法
Buffer.isEncoding(encoding);
//来测试encoding的编码是否有效,有效返回true,无效返回false
//类方法
Buffer.isBuffer(obj);
//判断对象obj是否是一个Buffer,是返回true,不是返回false
//类方法
Buffer.byteLength(string, encooding);
//求编码方式为encoding的字符串string的真实长度,当在写HTTP响应头Content-Length的时候,要用Buffer.byteLength,不要用String.prototype.length
//类方法
Buffer.concat(list, totalLength);
//将Buffer数字list中的所有Buffer对象拼接在一起,组成新的Buffer对象,第二个参数是list中Buffer的总长度
Buffer.length();
//求Buffer的byte大小,注意这里不是长度
Buffer.write(string, offset, length, encoding);
//string要写入的字符串, offset偏移量,可选, length长度,可选, encoding编码方式,默认utf8,可选
buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len));
Buffer.toString(encoding, start, end)
//三个参数都可选,end默认为length, 将Buffer解码为string