搜索

有思俱乐部学习园地

Node.js Buffer

Buffer

稳定性: 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

Buffer 类是全局变量类型,用来直接处理2进制数据。 它能够使用多种方式构建。

new Buffer(size)

分配一个新的 size 大小单位为8位字节的 buffer。 注意, size 必须小于kMaxLength,否则,将会抛出异常 RangeError。

new Buffer(array)

使用一个8位字节 array 数组分配一个新的 buffer。

new Buffer(buffer)

拷贝参数 buffer 的数据到 Buffer 实例。

new Buffer(str[, encoding]

分配一个新的 buffer ,其中包含着传入的 str 字符串。encoding 编码方式默认为 'utf8'。

类方法: Buffer.isEncoding(encoding)

如果参数编码 encoding 是有效的,返回 true,否则返回 false。

类方法: Buffer.isBuffer(obj)

obj 如果是 Buffer 返回 true, 否则返回 false。

类方法: Buffer.byteLength(string[, encoding]

将会返回这个字符串真实字节长度。 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.concat(list[, totalLength]

类方法: Buffer.concat(list[, totalLength]

返回一个buffer对象,它将参数 buffer 数组中所有 buffer 对象拼接在一起。
如果传入的数组没有内容,或者 totalLength 是 0,那将返回一个长度为 0 的buffer。
如果数组长度为 1,返回数组第一个成员。
如果数组长度大于 0,将会创建一个新的 Buffer 实例。
如果没有提供 totalLength 参数,会根据 buffer 数组计算,这样会增加一个额外的循环计算,所以提供一个准确的 totalLength 参数速度更快。

类方法: Buffer.compare(buf1, buf2)

和 buf1.compare(buf2)一样。 用来对数组排序:

var arr = [Buffer('1234'), Buffer('0123')];
arr.sort(Buffer.compare);

buf.length

返回这个 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

buf.write(string[, offset][, length][, encoding]

根据参数 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));

buf.writeUIntLE(value, offset, byteLength[, noAssert]

buf.writeUIntBE(value, offset, byteLength[, noAssert]

buf.writeIntLE(value, offset, byteLength[, noAssert]

buf.writeIntBE(value, offset, byteLength[, noAssert]

将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算,例如:

var b = new Buffer(6);
b.writeUIntBE(0x1234567890ab, 0, 6);
// 

noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。

buf.toString[encoding][, start][, end]

根据 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() 例子。

buf.toJSON()

返回一个 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);
// 

工作人员

 
               
作者:XXX
信息录入:XXX
文案编辑:XXX
视频录制:XXX
视频编辑:XXX
图片编辑:XXX
关键字修改:陈鑫