有关于node缓冲区的学习
1.node中为什么需要缓冲区?
js最初设计用来处理html文件,所以他并不适合用来处理二进制数据(对于字节的处理),但是在实际使用中,需要很多处理数据库通信,视频,上传文件等操作,都需要大量使用二进制数据操作。早期的node是通过将每个字节编码成文本字符来处理二进制数据的,资源浪费,速度缓慢,难以控制
于是node引入了一个二进制缓冲区来实现缓冲区的长度以字节为单位,并可以随机设置和获取缓冲区的数据(便于操作)
2 .创建缓冲区
创建方法:
var buf = new Buffer('Hello world');
第一个参数引号中间就是建立的缓冲区的内容。
第二个参数可选。是指定编码格式,不写的话默认utf8
可被接受的编码格式以及标识符
- asciI–ASCII 仅适用于ASCII字符集
- utf8–UTF-8 任意字符 首选编码 默认编码
- base64–Base64基于64个可打印的ASCII字符表示二进制数据
如果没有具体内容初始化,则可以用大小来进行初始化:
var buf = new Buffer(1024);//即创建长度为1024字节的缓冲区
需要注意的是当创建一个已经被初始化的缓冲区时,缓冲区所包含的数据并非是0,而是一些随机数据
var buf = new Buffer();
console.log(buf[100])//->5(随机值)
可以吧缓冲区当做数组理解,赋值,修改等
buf[2] = 2;//将第二个位置设定为2
还有length属性
var buf = new Buffer(100);
console.log(buf.length);
//->100
切分缓冲区
将指定缓冲区提取出来,通过指定起始位置和结束位置来切分缓冲区
var buf = new Buffer('baiyutingchoujiojio');
var smallerbuf = buf.slice(9,19);
console.log(smallerbuf.toString());//->choujiojio
截取的时候,起始位置就是从0开始数的第几位,结束位置是数出来的加一位
要注意的是,因为子缓冲区是从父缓冲区切分出来的,并没有为子缓冲区开辟新的内存,所以在修改父缓冲区的时候,在范围内的子缓冲区也会受到影响,而且创建子缓冲区后,父缓冲区不会被垃圾回收器回收,容易造成内存泄漏
复制缓冲区
即申请一块新的内存,灵活控制复制的范围
copy是原缓冲区的方法,有四个参数分别新缓冲区,开始粘贴位置,开始复制位置,结束复制位置
var buf1 = new Buffer('baiyutingchoujiojio');
var buf2 = new Buffer(10);
buf1.copy(buf2,0,9,19);
console.log(buf2.toString());//->choujiojio
可以避免产生内存泄漏问题
缓冲区解码
就是在tostring()里加参数,参数为"编码字符名",同样UTF-8默认
vat b64str = buf.tostring("base64");
在tostring() 里还可以加第二第三个参数,分别为 指定被转换数据的起始位置和终止位置,以字节为单位
推荐阅读
-
有关于node缓冲区的学习
-
深度学习总结:tensorflow和pytorch关于RNN的对比,tf.nn.dynamic_rnn,nn.LSTM
-
解锁新技能:关于mavon-editor的灵活使用,本人是因为有需要写了俩段代码,实际开发中,可通过属性来实现需求
-
《node学习--第二篇》使用nodejs创建一个简单的服务器
-
关于QVariant 的学习一点分享
-
关于 QAbstractItemModel 学习的一点分享
-
2014, 关于学习C++编程语言对中国软件发展的的一些思考! C++基础架构库图形可视化源码工业C++源码开放源码
-
2014, 关于学习C++编程语言对中国软件发展的的一些思考! C++基础架构库图形可视化源码工业C++源码开放源码
-
关于学习Docker的一点心得
-
docker学习的问题3--Error response from daemon: This node is not a swarm manager.