稳定性: 3 - 锁定
纯 Javascript 语言对 Unicode 友好,但是难以处理二进制数据。 在处理 TCP 流和文件系统时经常需要操作字节流。Node 提供了一些机制,用于操作、创建、以及消耗字节流。
在 Buffer 类实例化中存储了原始数据。 Buffer 类似于一个整数数组,在 V8 堆(the V8 heap)原始存储空间给它分配了内存。一旦创建了 Buffer 实例,则无法改变大小。
Buffer 类是全局对象,所以访问它不必使用 require('buffer') 。
Buffers 和 Javascript 字符串对象之间转换时需要一个明确的编码方法。下面是字符串的不同编码。
在Buffer中创建一个数组,需要注意以下规则:
注意:Node.js v0.8 只是简单的引用了array.buffer里的 buffer ,而不是克隆(cloning)。
介绍一个高效的方法,ArrayBuffer#slice() 拷贝了一份切片,而 Buffer#slice() 新建了一份。
Buffer 类是全局变量类型,用来直接处理2进制数据。 它能够使用多种方式构建。
分配一个新的 size 大小单位为8位字节的 buffer。 注意, size 必须小于kMaxLength,否则,将会抛出异常 RangeError。
使用一个8位字节 array 数组分配一个新的 buffer。
拷贝参数 buffer 的数据到 Buffer 实例。
分配一个新的 buffer ,其中包含着传入的 str 字符串。encoding 编码方式默认为 'utf8'。
如果参数编码 encoding 是有效的,返回 true,否则返回 false。
obj 如果是 Buffer 返回 true, 否则返回 false。
将会返回这个字符串真实字节长度。 encoding 编码默认是:utf8。 这和 String.prototype.length 不一样,因为那个方法返回这个字符串中字符的数量。
例如:
str = '\u00bd + \u00bc = \u00be'; console.log(str + ": " + str.length + " characters, " + Buffer.byteLength(str, 'utf8') + " bytes"); // ½ + ¼ = ¾: 9 characters, 12 bytes
返回一个buffer对象,它将参数 buffer 数组中所有 buffer 对象拼接在一起。 如果传入的数组没有内容,或者 totalLength 是 0,那将返回一个长度为 0 的buffer。 如果数组长度为 1,返回数组第一个成员。 如果数组长度大于 0,将会创建一个新的 Buffer 实例。 如果没有提供 totalLength 参数,会根据 buffer 数组计算,这样会增加一个额外的循环计算,所以提供一个准确的 totalLength 参数速度更快。
和 buf1.compare(buf2)一样。 用来对数组排序:
var arr = [Buffer('1234'), Buffer('0123')]; arr.sort(Buffer.compare);
返回这个 buffer 的 bytes 数。注意这未必是 buffer 里面内容的大小。length 是 buffer 对象所分配的内存数,它不会随着这个 buffer 对象内容的改变而改变。
buf = new Buffer(1234); console.log(buf.length); buf.write("some string", 0, "ascii"); console.log(buf.length); // 1234 // 1234
length 不能改变,如果改变 length 将会导致不可以预期的结果。如果想要改变 buffer 的长度,需要使用 buf.slice 来创建新的 buffer。
buf = new Buffer(10); buf.write("abcdefghj", 0, "ascii"); console.log(buf.length); // 10 buf = buf.slice(0,5); console.log(buf.length); // 5
根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。 offset 偏移量默认值是 0, encoding 编码方式默认是 utf8。 length 长度是将要写入的字符串的 bytes 大小。 返回 number 类型,表示写入了多少 8 位字节流。如果 buffer 没有足够的空间来放整个 string,它将只会只写入部分字符串。 length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。
buf = new Buffer(256); len = buf.write('\u00bd + \u00bc = \u00be', 0); console.log(len + " bytes: " + buf.toString('utf8', 0, len));
将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算,例如:
var b = new Buffer(6); b.writeUIntBE(0x1234567890ab, 0, 6); //
noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
根据 encoding 参数(默认是 'utf8')返回一个解码过的 string 类型。 还会根据传入的参数 start (默认是 0) 和 end (默认是 buffer.length)作为取值范围。
buf = new Buffer(26); for (var i = 0 ; i < 26 ; i++) { buf[i] = i + 97; // 97 is ASCII a } buf.toString('ascii'); // 输出: abcdefghijklmnopqrstuvwxyz buf.toString('ascii',0,5); // 输出: abcde buf.toString('utf8',0,5); // 输出: abcde buf.toString(undefined,0,5); // encoding defaults to 'utf8', 输出 abcde
查看上面 buffer.write() 例子。
返回一个 JSON 表示的 Buffer 实例。JSON.stringify 将会默认调用字符串序列化这个 Buffer 实例。
例如:
var buf = new Buffer('test'); var json = JSON.stringify(buf); console.log(json); // '{"type":"Buffer","data":[116,101,115,116]}' var copy = JSON.parse(json, function(key, value) { return value && value.type === 'Buffer' ? new Buffer(value.data) : value; }); console.log(copy); //
作者:信息录入:文案编辑:视频录制:视频编辑:图片编辑:关键字修改: