Buffer二进制缓冲

目录

介绍

创建buffer类

buffer合并与剪切

buffer截取具体内容


介绍

JavaScript语言自身只有字符串数据类型,没有二进制数据类型。但在处理文件流时,必须使用到二进制数据。因此在Node.js中,定义了一个buffer类,该类用来创建一个专门存放二进制数据的缓存区


创建buffer类

var var str = "好好学习";
var var buff1 = new Buffer(str); // ⽅法1
var var buff2 = Buffer.from(str); // ⽅法2
console.log( str, str.length );
console.log( buff1, buff1.length );
console.log( buff2, buff2.length );
console.log( JSON.stringify(buff2) );
console.log( buff2.toString() ) //可把普通的数据转换为字符串

在v6.0之前创建Buffer对象直接使⽤new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相⽐很⼤,可以直接捕获⼀些敏感信息,所以在 v6.0以后,官⽅⽂档⾥⾯建议使⽤ Buffer.from() 接⼝去创建Buffer对象。


buffer合并与剪切

var buff1 = new buffer("我爱")
var buff2 = new buffer("学习")
//合并 concat方法不会对buff1和buff2造成修改
var buff3 = Buffer.concat([buff1,buff2]) 
var buff4 = buff1.slice(0,1)
console.log(buff3,buff4.toString())
//"爱学习" "我"

buffer截取具体内容

拿到数据之后通常要对数据进行分解,通常会有两个关键内容,一个是文件名称,一个是具体内容

1. ⽂件名称:第2⾏,filename的值。

2. 具体内容:第5⾏、第6⾏、第7⾏。

下面的完整的代码演示:(对文字和图片都有非常好的转码适配效果)

var http = require('http')
var fs = require('fs')
http.createServer((request,respose)=>{
    respose.writeHead(200,{
        "Content-Type":"text/html;charset=utf-8"
    })
    switch(request.url){
        case "/template":
            respose.write(fs.readFileSync("./template.html"))
            break;
        case "/chk":
            respose.write('上传')
            var chunks = [] //用于存储二进制数据
            request.on('data',chunk=>{
                chunks.push(chunk) //每当监听到数据时,都会往盒子里面追加数据
            })
            request.on('end',()=>{
                var h = Buffer.concat(chunks) //当数据追加完之后进行合并
                var arr = [] //收集上传的文件内容中,所有换行符号的下标
                for(var i=0;i<h.length;i++){
                    if( h[i]==13 && h[i+1]==10 ){ //一次空格会有两个字符分别是13和10
                        arr.push(i) //将空格收集起来
                    }
                }
                // console.log(arr); //[ 40, 104, 144, 146, 163, 207 ]
                //获取文件名称
                var filename = h.slice(arr[0]+2,arr[1]).toString().split('filename=')[1].replace(/\"/g,"")
                //获取文件内容
                var data = h.slice(arr[3]+2,arr[arr.length-2])
                fs.writeFileSync(filename,data,function(err){
                    console.log(err);
                })
            })
            break;
    }
    respose.end(); //返回值,必须要返回值
}).listen(8082)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的白银时代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值