node大内存操作Buffer

let x='abcdefg';
let y='零一二三四五六七八九十';
console.log(x.length) //7
console.log(y.length)  //11
let str="深入浅出node.js";
let buf=new Buffer(str,'utf-8');
//buffer是C++层面分配的,所得内存不在V8内
//buffer是用来处理大文件,二进制数据的
//buffer可以像数组一样按照下标进行访问
Buffer.isEncoding('encoding') //判断encoding是否是buffer支持的编码类型
//Buffer默认utf-8编码
//字符串转buffer
// new Buffer(str, [encoding]);

//向buffer中写入字符串
// buf.write(string, [offset], [length], [encoding])

//buffer转字符串
// buf.toString([encoding], [start], [end])
console.log(buf) //<Buffer e6 b7 b1 e5 85 a5 e6 b5 85 e5 87 ba 6e 6f 64 65 2e 6a 73>
console.log(buf.length) //19
console.log('---------')
let buff=new Buffer(100)
console.log(buff.length)//100

//buffer初始化时其值时随机分配的0~255之间的整数
console.log('buff[10]=',buff[10]) //0
buff[10]=100
console.log('buff[10]=',buff[10]) //100
//值小于0时,将会+256直到大于0
buff[20]=-100
console.log('buff[20]=',buff[20]) //156
//值大于255时,将会-256,直到小于255
buff[21]=300
console.log('buff[21]=',buff[21]) //44
//小数会取整
buff[22]=3.1415
console.log('buff[22]=',buff[22]) //3
console.log('----------')
console.log(Buffer.isEncoding('GBK'))  //false
console.log(buf.toString('UTF-8')) //深入浅出node.js
let iconv = require('iconv-lite');
//iconv-lite是纯JavaScript写的第三方buffer转码库
let ss=iconv.decode(buf,'win1251');
console.log(ss) //ж·±е…Ґжµ…е‡єnode.js
let ff=iconv.encode("国家 input string",'utf8')
console.log(ff.toString("utf-8")) //国家 input string
let fs=require('fs')
// let rs=fs.createReadStream('test.txt',{highWaterMark:9}); //正常读取
let rs=fs.createReadStream('test.txt',{highWaterMark:10});
// rs.setEncoding('utf-8')
//窗前明���光,��是地上霜 不设置编码
let data='';
rs.on("data",function (chunk) {
    // data=data.toString()+chunk.toString();
    data+=chunk;
})
rs.on("end",function () {
    console.log(data)
})
console.log('====')
let StringDecoder = require('string_decoder').StringDecoder;
let decoder = new StringDecoder('utf8');
let buf1 = new Buffer([0xE5, 0xBA, 0x8A, 0xE5, 0x89, 0x8D, 0xE6, 0x98, 0x8E, 0xE6, 0x9C]);
console.log(decoder.write(buf1));
//月光,疑
let buf2 = new Buffer([0x88, 0xE5, 0x85, 0x89, 0xEF, 0xBC, 0x8C, 0xE7, 0x96, 0x91, 0xE6]);
console.log(decoder.write(buf2));
//月光,疑


//正确读取文件流
let chunks=[];
let size=0;
rs.on('data',function (chunk) {
    chunks.push(chunk)
    size+=chunk.length
})
rs.on('end',function () {
    let buf=Buffer.concat(chunks,size)
    let str=iconv.decode(buf,'utf8');
    console.log(str)
})

//Buffer.concat()的实现
Buffer.concat=function (list,length) {
    if (!Array.isArray(list)) {
        throw new Error('Usage buffer .concat(list,[length])');
    }
    if (list.length===0){
        return new Buffer(0)
    } else if (list.length===1) {
        return list[0]
    }

    if (typeof length!=='number') {
        length=0;
        for (let i=0;i<list.length;i++) {
            let buf=list[i];
            length+=buf.length
        }
    }
    let buffer=new Buffer(length)
    let pos=0;
    for (let ii=0;ii<list.length;ii++) {
        let buf=list[ii]
        buf.copy(buffer,pos);
        pos+=buf.length;
    }
    return buffer;
}

//通过将静态内容预先转换成buffer对象,可以有效减少CPU的重复利用
//非二进制的数据在网络传输前需要转换成二进制,然后再进行传输


//在读取文件时设置 highWaterMark的值,其大小会影响效率
//设置过小,可能会导致系统调用次数过多,因为需要将接受到的字节写入文件
//设置过高,可能会造成空间浪费
//在读取大文件时,highWaterMark的值越大 其效率越高
//在读取宽字节数据时,如果未进行转码,可以将highWaterMark设置为宽字节的倍数

//字符串和Buffer的关系
//字符串所占内存是V8管理,Buffer是由C++层面分配
//字符串里存储的是编码后的数据,Buffer里存储的是二进制数据0101
//字符串和Buffer之间存在编码关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值