Node.js Buffer使用方法

原创 2015年07月06日 18:29:32

最近因为要处理TCP发过来的包,TCP提供的是字节流服务,接收端不知道每次TCP发送端每次发送的数据是多少字节。所以接收端就不能每次都把接收到的数据都按照同样的方式进行处理,假如,我们每次处理156 ,但是每次接收的可能之后100个字节,这样就会造成解析错误。所以我们采取了一个环形Buffer的方式,接收到的数据,都放到缓存环形Buffer中,取得时候,就每次取156个长度的Buffer,进行处理即可。这个过程中,充分学习了Buffer的各种操作,对其原理进行了了解。

1.创建Buffer的方式:

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

new Buffer(8)

分配一个大小为8字节的buffer,长度为8

var testbuffer = new Buffer(10);
console.log(testbuffer.length);
输出:10

这时缓冲区的数据并没有被初始化为0,而是随机数据。

new Buffer(str ,[encoding])

分配一个新的 buffer ,其中包含着给定的 str字符串. encoding 编码方式默认是:'utf8'.它的长度要根据存入的str来定,其中一个中文字符(标点也是)占三个字节。例如:

var testbuffer = new Buffer("test测试");
console.log(testbuffer.length);
打印输出:10

new Buffer(Buf)

复制Buf到一个新的Buffer实例中

var testbuffer = new Buffer("test测试");
console.log(testbuffer.length);
console.log(testbuffer.toString());
var testbuffer1 = new Buffer(testbuffer);
console.log(testbuffer1.length);
console.log(testbuffer1.toString());
输出:
10
test测试
10
test测试


new Buffer(array);

创建一个Buffer,用一个八位字节的数组。

var testbuffer = new Buffer([0x74,0x65,0x73,0x74]);
console.log(testbuffer.length);
console.log(testbuffer.toString());
输出:
4
test

2.设置Buffer内容

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

string:要写入的字符串

offset:偏移量,默认为0

length:长度,默认为字符串的长度

encoding:编码,默认为utf-8

var testbuffer = new Buffer(10);
testbuffer.write('test',0);
testbuffer.write('buffer',4);
console.log(testbuffer.toString());
输出:
Testbuffer
 
var testbuffer = new Buffer('test测试');
testbuffer.write('test');
testbuffer.write('buffer',4);
console.log(testbuffer.toString());
输出:
testbuffer

要把数字以大小端的方式写入buffer,采用bufferapi,他有很多种这样的api,我们来以buf.writeInt32LE(value, offset, [noAssert])为例

value Number类型

offset Number类型

noAssert Boolean类型可选参数默认: false

 

介绍这个API之前,还是要先介绍下大小端读取和写入方式,

比如现在要存入16843008,其二进制为00000001 00000001 00000001 00000000

如果以小端的方式存的话,地址为4001,4002,4003,4004

那么他们对应方式为:

2001

2002

2003

2004

00000000

00000001

00000001

00000001

也就是低地址存放,值的低位,高地址存放值的高位

这种存储方式最适合人的思维,

如果以大端来存的话,对应方式为:

2001

2002

2003

2004

00000001

00000001

00000001

00000000

也就是低地址存放,值的高位,高地址存放值的低位

这种方式最适合人的感官感觉 一一对应

怎么放的,怎么读就可以了,比如以小端读取小端方式存储的时候,读取到的数据是 00000001 00000001 00000001 00000000

而读取到大端方式存储的时候,读取到的数据是:

00000000 00000001 00000001 00000001。读取数据错误

那么,对于buf.writeInt32LE(value, offset, [noAssert])就不用多做介绍了,他对应的读方式是buf.readInt32LE(value, offset, [noAssert]),还有很多类似的方式,请看官方API

3.解码缓冲区

默认的buffer都是以utf-8来编码的,他支持的编码格式有:asciiutf8base64binary(弃用),hex(把每个byte编码成2个十六进制字符)

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

采用这种方式来进行解码

如果设置解码方式,默认为utf-8

4.Buffer的连接和复制

复制buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])

也就是把buf中的数据,拷贝到targetBuffer的相应位置。(sourceStartsourceEnd 不写时,默认复制整个buff)。

var test1 = new Buffer('1234');
var test2 = new Buffer(4);
var test3 = new Buffer('testbuffer');
test1.copy(test2,0)
console.log(test2.toString());
test1.copy(test2,0,2,4)
console.log(test2.toString());
test1.copy(test3,0,2,4);
console.log(test3.toString());
test1.copy(test3,6,2,4);
console.log(test3.toString());
输出:
1234
3434
34stbuffer
34stbu34er


连接Buffer.concat(list, [totalLength])这是个类方法:

list {Array}数组类型,Buffer数组,用于被连接。

totalLength {Number}类型,这里的大小是指所传入的数组,所占用的比特长度,不是数组的长度。如果没有设置这项参数,会进行计算这个值,但是最好还是设置一下,要不然会额外增加运算,影响性能。

此方法返回一个buffer ,由数组中的buffer连接组成的buffer

如果totalLength设置的小于所占用的长度,那么将会被分隔。

var test1 = new Buffer('test');
var test2 = new Buffer('Buffer测试');
var test3 = Buffer.concat([test1,test2],16);
console.log(test3.toString());
输出:
testBuffer测试


如果设置totalLength10 那么输出为testBuffer

其中一个中文字符为3个字节。

5.Buffer.byteLength(string, [encoding])

console.log(Buffer.byteLength('Buffer测试', 'ascii'));
输出:12
console.log(Buffer.byteLength('Buffer测试', 'utf-8'));
输出:8


这个方法计算出不同编码,所占用的byte字节。

6. buf.slice([start], [end])

返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址,负的索引是从buffer尾部开始计算的。

var test = new Buffer('Buffer测试');
console.log(test.slice(0,9).toString());
console.log(test.slice(0,-3).toString());
输出:
Buffer测
Buffer测

7. buf[index]

获取或者设置在指定index索引位置的8位字节。这个值是指单个字节,范围为16进制的0x00 0xFF,或者255

var test = new Buffer(4);
test[0]='0x54';
test[1]='0x45';
test[2]='0x53';
test[3]='0x54';
console.log(test.toString());
输出:TEST


以上就是Buffer的各种操作,就介绍到这里,后面会深入buffer写,看buff而到底是个什么玩意!

相关文章推荐

Node.js-require的使用方法

require最常用的方法 require('http') 内置模块 require('./server')  “./”表示当前路径,后面跟的是相对路径 require("../lib/...

node.js Buffer常用方法

//Buffer缓冲区 var buf = new Buffer(100); //创建长度为10字节的Buffer实例; //写入缓冲区,write方法的返回值是实际写入的大小,如果空间不足只会写入...

Node.js Buffer 模块常用的方法

Node.js Buffer 模块常用的方法(注意有些方法在旧版本是没有的): 序号 方法 & 描述 1 new Buffer(size)  分配一个新的...

Node.js 使用Buffer模块缓存数据

缓冲数据是由一系列的大端或小端格式字节组成的,这意味着它们比文本数据占用较小的空间。因此Node.js提供Buffer(缓冲区)模块,允许在缓冲区创建、读取、写入和操作二进制数据。1 创建缓冲区、写入...

Node.js——使用Buffer类处理二进制数据

5.1 创建Buffer对象 在Node.js中,Buffer类可以在任何一个模块中被 利用,不需要为该类的使用加载任何模块。 Buffer有三种形式的构造函数: ①new Buff...

node.js学习(十三、Buffer模块)

Buffer主要用来处理二进制流,适用于tcp流或文件流的处理。 Buffer跟其他语言的int[]数组类似。Buffer 的大小在其创建时就已确定,且不能调整大小。 Buffer为全局对象,无需...

《超实用的Node.js代码段》连载二:正确拼接Buffer

对于初学Node.js框架的开发人员来说,可能认为Buffer模块比较易学、重要性也不是那么突出。其实,Buffer模块在文件I/O和网络I/O中应用非常广泛,其处理二进制的性能比普通字符串性能要高出...
  • kgsew
  • kgsew
  • 2016年03月17日 10:37
  • 511

微信小程序 Node.js (基础六) Buffer(缓冲区)

微信小程序 Node.js Buffer

Node.js Buffer学以致用

学习要点: 写入缓冲区 从缓冲区读取数据 把 Buffer 转换为 JSON 对象 合并缓冲区 拷贝缓冲区 缓冲区裁剪 缓冲区长度...

Node.js v0.10.31API手册-Buffer

Buffer 纯 JavaScript 对 Unicode 友好但是无法很好地处理二进制数据。当我们面对类似 TCP 流或文件系统时,是需要处理八位流的。Node 有几种操作、创建以及消费八位流的策略...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Node.js Buffer使用方法
举报原因:
原因补充:

(最多只允许输入30个字)