Buffer

在传输时临时用于存储输出或输入数据的存储器。

new Buffer(array)

使用array分配一个新的 Buffer,array 类型为数字类型。

  • 参数说明:

    参数 类型 是否必要 说明
    array array 要从中复制的字节数组
var arr = [0x01, 0x02, 0x03, 0x04, 0x05];
var bufferObj = new Buffer(arr);

new Buffer(size, encoding)

新建一个大小为 size 字节的 Buffer。encoding 参数制定字符串编码。

  • 参数说明:

    参数 类型 是否必要 说明
    size number 新建 Buffer 的长度
    encoding string 字符串编码('utf8','ascii','hex')。 默认: 'utf8'
// 创建一个 size 大小为 10 的 buffer
var bufferObj = new Buffer(10, 'utf8');  // 'utf8' 为默认,可省略。

new Buffer(string, encoding)

创建一个包含给定字符串为 string 的 Buffer。encoding 参数制定字符串编码。

  • 参数说明:
参数 类型 是否必要 说明
string string 要编码的字符串
encoding string 字符串编码('utf8','ascii','hex')。 默认: 'utf8'
var bufferObj = new Buffer('newbufferstring', 'utf8');  // 'utf8' 为默认,可省略。

Length

  • 返回类型: number

    buf的长度

var arr = [0x01, 0x02, 0x03, 0x04, 0x05];
var bufferObj = new Buffer(arr);
console.log('#>> ' + bufferObj.length);    // "#>> 5"

fill(value, offset, end, encoding)

将 [offset, end] 这个闭区间内填充value,如果未指定 offset 和 end,则填充整个 buf。

value 如果不是一个字符串或整数,则会被强行转换为 uint32 值,再往里面顺序填充,直至填充不下,剩下的会被舍弃。

  • 参数说明:
参数 类型 是否必要 说明
value string,buffer,int 用来填充 buf 的值
offset number 开始填充 buf 前要跳过的字节数。默认: 0。
end number 结束填充 buf 的位置(不包含)。默认: buf.length。
encoding string 如果 value 是一个字符串,则这是它的字符编码('utf8','ascii','hex')。默认: 'utf8'。
  • 返回类型: Buffer

    buf 的引用

var bufferObj = new Buffer(10);
// 使用 '0' 填充 buffer
bufferObj.fill('0', 0, 9, 'utf8');

copy(target, targetStart, sourceStart, sourceEnd)

拷贝 buf 的一个区域的数据到 target 的一个区域,即便 target 的内存区域与 buf 的重叠。

  • 参数说明:
参数 类型 是否必要 说明
target Buffer 要拷贝进的 Buffer
targetStart number target 中开始拷贝进的偏移量。 默认: 0
sourceStart number buf 中开始拷贝的偏移量。 默认: 0
sourceEnd number buf 中结束拷贝的偏移量(不包含)。 默认: buf.length
  • 返回类型:number

被拷贝的字节数。

var cpBuf = new Buffer(8);
var bufferObj = new Buffer('cpbuf');
bufferObj.copy(cpBuf, 0)   // 默认值 sourceStart 和 sourceEnd 可以省略

toString(encoding, start, end)

根据 encoding 指定的字符编码解码 buf 成一个字符串。 start 和 end 可传入用于只解码 buf 的一部分。

  • 参数说明:
参数 类型 是否必要 说明
encoding string 解码使用的字符编码('utf8','ascii','hex')。 默认:utf8
start number 开始解码的字节偏移量。默认: 0
end number 结束解码的字节偏移量(不包含)。 默认: buf.length
  • 返回类型: string

    解码后的字符串

var bufferObj = new Buffer('newbufferstring', 'utf8');
console.dir(bufferObj.toString('utf8'));    // "newbufferstring"

write(string, offset, length, encoding)

根据 encoding 的字符编码将 string 从 buf 的 offset 位置开始写入。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则不会进行写入操作。

  • 参数说明:
参数 类型 是否必要 说明
string string 要写入 buf 的字符串。
offset number 开始写入 string 前要跳过的字节数。默认: 0。
length number 写入的字节数。默认: buf.length - offset。
encoding string string 的字符编码('utf8','ascii','hex')。默认: 'utf8'。
* string 参数的长度不能大于 buffer 长度.
  • 返回类型: number

    写入的字节数

var bufferObj = new Buffer(10)
// 将字符串 'writestr' 写入 bufferObj 内 0 - 8 位置
console.dir(bufferObj.write('writestr', 0, 8, 'utf8'))          // 8 写入数量
console.dir(bufferObj.write('writestr12', 0, 10, 'utf8'))       // 10 写入数量
console.dir(bufferObj.write('writestr123', 0, 10, 'utf8'))      // 0 写入数量 string 的长度大于 buffer 长度了
console.dir(bufferObj.toString('utf8'))                         // "writestr"

concat(target)

合并target

  • 参数说明:
参数 类型 是否必要 说明
target Buffer 需要合并的buf
  • 返回类型: Buffer

    返回合并后新建的Buffer

var bufferObj = new Buffer(10)
var newbuf = bufferObj.concat(new Buffer([9, 8, 7, 6])) // 返回的 newbuf 是一个 size 大小为 14 的新 buffer

read family

以1, 2或4字节作为大字节¹ 或小字节² 数的偏移量来读取 buffer 中的二进制数据。

用不同字节序存储数字 0x12345678(即十进制中的 305 419 896)
¹ 大字节(big -endian) :0x12 0x34 0x56 0x78
² 小字节(little-endian):0x78 0x56 0x34 0x12

1.  Buffer.readInt8(offset)         ---     读取有符号的一个字节
2.  Buffer.readUInt8(offset)        ---     读取无符号的一个字节
3.  Buffer.readInt16BE(offset)      ---     读取大端有符号的两个字节
4.  Buffer.readUInt16BE(offset)     ---     读取大端无符号的两个字节
5.  Buffer.readInt16LE(offset)      ---     读取小端有符号的两个字节
6.  Buffer.readUInt16LE(offset)     ---     读取小端无符号的两个字节
7.  Buffer.readInt32BE(offset)      ---     读取大端有符号的四个字节
8.  Buffer.readUInt32BE(offset)     ---     读取大端无符号的四个字节
9.  Buffer.readInt32LE(offset)      ---     读取小端有符号的四个字节
10. Buffer.readUInt32LE(offset)     ---     读取小端无符号的四个字节
  • 参数说明:

    参数 类型 是否必要 说明
    offset number 读取的偏移量。默认: 0。
  • 返回类型:number

    读取到的二进制数据

var arr = [0x01, 0x02, 0x03, 0x04, 0x05];
// 创建一个 5 字节的 buffer
var bufferObj = new Buffer(arr, encode);
var offset = 0;
// 读取第一位字节,转为 16 进制
console.dir(bufferObj.readInt8(offset));       // 1.000000
console.dir(bufferObj.readUInt8(offset));      // 1.000000

// 读取第一、第二 两位字节,转为 16 进制 (大端) 
// 计算方式:0102 ----- 的 16 进制转换为 10 进制 -----> 258
console.dir(bufferObj.readInt16BE(offset));    // 258.000000
console.dir(bufferObj.readUInt16BE(offset));   // 258.000000

// 读取第一、第二 两位字节,转为 16 进制 (小端)
// 计算方式:0201 ----- 的 16 进制转换为 10 进制 -----> 513
console.dir(bufferObj.readInt16LE(offset));    // 513.000000
console.dir(bufferObj.readUInt16LE(offset));   // 513.000000

// 读取第一、第二、第三、第四 四位字节,转为 16 进制 (大端) 
// 计算方式:01020304 ----- 的 16 进制转换为 10 进制 -----> 16909060
console.dir(bufferObj.readInt32BE(offset));    // 16909060.000000
console.dir(bufferObj.readUInt32BE(offset));   // 16909060.000000

// 读取第一、第二、第三、第四 四位字节,转为 16 进制 (小端) 
// 计算方式:04030201 ----- 的 16 进制转换为 10 进制 -----> 67305985
console.dir(bufferObj.readInt32LE(offset));    // 67305985.000000
console.dir(bufferObj.readUInt32LE(offset));   // 67305985.000000

writeUInt family

1. Buffer.writeUInt8(value, offset)        ---     写入一个无符号的字节
2. Buffer.writeUInt16BE(value, offset)     ---     写入两个大端无符号的字节
3. Buffer.writeUInt16LE(value, offset)     ---     写入两个小端无符号的字节
4. Buffer.writeUInt32BE(value, offset)     ---     写入四个大端无符号的字节
5. Buffer.writeUInt32LE(value, offset)     ---     写入四个小端无符号的字节
  • 参数说明:

    参数 类型 是否必要 说明
    value number 写入的值
    offset number 写入的偏移量。默认: 0。
  • 返回类型:number

    偏移量加上写入的字节

var bufferObj = new Buffer([0x01,0x02,0x03,0x04,0x05], 'hex');
var value = 6;
var offset = 0;

// 打印出 写入的字节

// 计算方法:0102030405 ---- 从 offset 位写为一字节 value 值 ----> 0602030405
console.dir(bufferObj.writeUInt8(value, offset));               // 1.000000
console.dir(bufferObj.toString('hex'));    // "0602030405"

// 计算方法:0102030405 ---- 从 offset 位写为两字节 value 值 ----> 0006030405
console.dir(bufferObj.writeUInt16BE(value, offset));            // 2.000000
console.dir(bufferObj.toString('hex'));    // "0006030405"

// 计算方法:0102030405 ---- 从 offset 位写为两字节 value 值,转换为小端 ----> 0600030405
console.dir(bufferObj.writeUInt16LE(value, offset));            // 2.000000
console.dir(bufferObj.toString('hex'));    // "0600030405"

// 计算方法:0102030405 ---- 从 offset 位写为四字节 value 值 ----> 0000000605
console.dir(bufferObj.writeUInt32BE(value, offset));            // 4.000000
console.dir(bufferObj.toString('hex'));    // "0000000605"

// 计算方法:0102030405 ---- 从 offset 位写为四字节 value 值,转换为小端 ----> 0600000005
console.dir(bufferObj.writeUInt32LE(value, offset));            // 4.000000
console.dir(bufferObj.toString('hex'));    //"0600000005"

jsonParse(start,end)

把 bufder 中的一段数据转换成JSON对象。* 该段数据需为 json 字符串。

  • 参数说明:

    参数 类型 是否必要 说明
    start number 指定要转换成JSON对象的数据的起始位置。默认:0
    end number 指定要转换成JSON对象的数据的结束位置。默认:Buffer.length
  • 返回类型:object

    根据指定数据返回的JSON对象。

var jsonStr = '{ \"property\":[ \"test.png\", \"255, 112, 208, 200\" ] }';
var bufferObj = new Buffer(jsonStr, 'utf8')
console.dir(bufferObj.jsonParse(0, jsonStr.length));   // {property : ["test.png", "255, 112, 208, 200", ]}

// 如果 buffer 内包含除 json 以外的其他信息,需要知道 json 相关 buffer 的长度
bufferObj = new Buffer(jsonStr + 'string', 'utf8')
console.dir(bufferObj.jsonParse(0, jsonStr.length));   // {property : ["test.png", "255, 112, 208, 200", ]}