nodejs-Buffer

Buffer 作为一个全局变量,不需要使用require(‘buffer’).Buffer来引入;Buffer的作用就是用来处理二进制数据流,直接对内存进行操作;Buffer的大小一旦被确定就不能被修改

Buffer底层是arrayBuffer,(buf.buffer === arrayBuffer) is true,arrayBuffer又称类型化数组,其成员是0/1二进制数据,一旦初始化则固定大小,不再扩充或缩小;arrayBuffer将数据放在栈中,数组则放在堆中,arrayBuffer取数据更快

 nodejs 编码格式 支持 ascii, utf8, utf16le, ucs2, base64, latin1, binary, hex

Buffer模块初解,创建、写入和读取

创建并填充:Buffer.alloc(size[, fill[, encoding]])

创建不填充:Buffer.allocUnsafe(size)

创建包含字符串:Buffer.from(string[, encoding]

 

填充:buf.fill(value[, offset[, end]][, encoding]

读:buf.toString(); buf[index]; buf.slice(); buf.readUIbt8();

var cl = function(data){
    console.log(data);
}
var clstr = function(data){
    console.log(data.toString());
}


/** Buffer.alloc(size[, fill[, encoding]])
 * size : 创建缓存大小
 * fill : 默认填充/初始化 类型:string || Buffer || integer, 默认0
 * encoding : 编码 fill == string ,encoding = utf8
 * 
 * 如果制定了fill[, encoding],则会调用Buffer.fill(fill[, encoding])初始化分配的Buffer
 */
var falloc = ()=>{
    const buf1 = Buffer.alloc(10);   // 创建长度为10,默认用0填充的Buffer
    console.log(buf1);   // 16进制数的buffer流
    
    const buf2 = Buffer.alloc(10,1); //长度为10,用0x1填充的Buffer
    console.log(buf2);

    // 特殊测试
    var buf3 = Buffer.alloc(10,'thetest');
    clstr(buf3);                    // 'thetestthe'
    cl(buf3.length);
}
// falloc();


/** Buffer.allocUnsafe(size)
 * size : 创建缓存大小
 */
var fallocUn = ()=>{
    var buf4 = Buffer.allocUnsafe(10);// 不带有初始化功能,更快
    buf4.fill(0);    //初始填充
    console.log(buf4);
}
// fallocUn();


/** Buffer.from(string[, encoding])
 * string : 要编码的字符串
 * encoding : 编码
 */
var ffrom = ()=>{
    const buf5 = Buffer.from([1,2,99]);
    console.log(buf5);   
    console.log(buf5.toString());   // 输出对应的ascii的字符
    console.log(buf5[2]);           // '99'

    const buf6 = Buffer.from('test');   // 默认UTF-8字节格式的buffer
    console.log(buf6);                  // '<Buffer 74 65 73 74>'
    console.log(buf6.toString());       // 'test'

    const buf7 = Buffer.from('test', 'latin1'); // Latin-1字节格式的buffer
    console.log(buf7);                  // <Buffer 74 65 73 74>
    console.log(buf7.toString());       // 'test'
}
// ffrom();


/** Buffer.toString([encoding, [start, [end]]])
 * encoding : 编码格式 支持 ascii, utf8, utf16le, ucs2, base64, latin1, binary, hex
 * start : 开始位置(0 to buf.length-1)
 * end : 结束位置(不包含该索引位置数据)
 */
// For Example
var f2str = ()=>{
    const buf7 = Buffer.allocUnsafe(256);
    // buf7.fill(1);
    // console.log( buf7.toString(0,10));   ERROR:UnKnown encoding
    console.log( buf7.toString(undefined,0,10));  // encoding 不可为null,可以是undefined
}
// f2str();

/** for...of */
var ffor = ()=>{
    const buf = Buffer.from([1,2,3]);

    for(const b of buf){
        console.log(b); // 遍历
    }
}
// ffor();

Buffer操作,合并,比较,拷贝,剪裁,释放

合并:Buffer.concat(list[,totalLength]);

比较:buf.compare(otherBuffer);    buf.equals(otherBuffer)

拷贝:buf.copy(targetBuffer[, targetStart[, sourcestart[, sourceEnd]]])

剪裁:buf.slice([start[, end]]);

释放:无法手动对buffer实例进行GC,只能依靠V8来进行,我们唯一能做的就是解除对buffer实例的引用。

Buffer转JSON,修改数据编码

代码示例:

var cl = function(data){
    console.log(data);
}
var clstr = function(data){
    console.log(data.toString());
}

///Buffer 操作
/** 合并  Buffer.concat(list[, totalLength])
 * list : 用于合并的Buffer对象数组
 * totalLength : 合并后的Buffer对象总长度
 * 
 * return 新的Buffer对象
 */
var fconcat = function(){
    const buf1 = Buffer.from('Buffer相关操作:');
    const buf2 = Buffer.from('多个buf合并成一个');
    const bufT = Buffer.from('~顺序的重要性~');
    const buf3 = Buffer.concat([buf1, bufT, buf2]);
    clstr(buf3);    //"Buffer相关操作:~顺序的重要性~多个buf合并成一个"
    
    const buf4 = Buffer.concat([buf1, buf2, bufT], 50);// UTF-8一个汉字占用3个字节!Unicode中英统统2个字节
    clstr(buf4);    //"Buffer相关操作:多个buf合并成一个~顺�"
}
// fconcat();


/** 比较  buf.compare(otherbuf);
 * otherbuf : 用作比较的目的Buffer对象
 * 
 * return(-1/0/1)
 * 从第一位开始比对ascii,直到(return !=0 || 对比位=='\0')return 0; 
 */
var fcompare = function(){
    var buf1 = Buffer.from('abc');
    var buf2 = Buffer.from('abcd');
    var buf3 = Buffer.from('ABC');

    cl(buf1.compare(buf2));     // abc?abcd   -1
    cl(buf1.compare(buf3));     // abc?ABC     1
    cl(buf2.compare(buf3));     // abcd?ABC    1
}
// fcompare();


/** 拷贝  buf.copy(targetBuffer[, targetStart[, sourcestart[, sourceEnd]]])
 * targetBuffer : 被更改的的Buffer对象
 * targetStart : Number,被更改的起始位置
 * sourceStart : Number,开始拷贝的起始位置
 * sourceEnd : Number,拷贝的结束位置
 * 
 * return 被拷贝的字节数
 * *覆盖式 *不会扩充其长度
 */
var fcopy = function(){
    var buf1 = Buffer.from('0123456789');
    var buf2 = Buffer.from('abcde');
    var buf3 = Buffer.from('1234567890');

    // 不会扩充其长度
    buf2.copy(buf3, 2);
    buf1.copy(buf2, 1);

    clstr(buf1);    //"0123456789"
    clstr(buf2);    //"a0123"
    clstr(buf3);    //"12abcde890"
}
// fcopy();


/** 剪裁  buf.slice([start[, end]]);
 * start : number,剪裁开始点  ((start<0) : buf.length + start )
 * end : number,剪裁结束点    ((end<0) : buf.length + end )
 * *start <= end return ''
 */
var fslice = function(){
    var buf1 = Buffer.from('thetestdata');

    var buf2 = buf1.slice();    // thetestdata
    clstr(buf2);
    
    var buf3 = buf1.slice(3);   // testdata
    clstr(buf3);

    var buf4 = buf1.slice(3,7); // test
    clstr(buf4);

    var buf5 = buf1.slice(8,8); // ''
    clstr(buf5);

    var buf6 = buf1.slice(7,3); // ''
    clstr(buf6);

    var buf7 = buf1.slice(-4);
    clstr(buf7);                // 'data'

    var buf8 = buf1.slice(0,100);
    clstr(buf8);                // 'thetestdata'
    cl(buf8.length);            // 11

    var buf9 = buf1.slice(-4,-2);
    clstr(buf9);                // 'da'
}
// fslice();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值