nodejs之buffer

最近一直对JS中的二进制数据处理,存在好多疑问。所以就趁机会吧JS中的二进制数据相关知识理理。下面就记录下我最近的看的东西和理解吧,仅限参考。建议读者,按照文章顺序阅读,要不然中间掺杂的东西容易混。反正我是容易混,哈哈哈。

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

基础知识:https://www.runoob.com/nodejs/nodejs-buffer.html

上述链接详细的描述了buffer的基本定义和使用方式,但是我一直好奇buffer内部的数据到底是怎么存储的。我就尝试着打印了下。

let a = Buffer.from('123456','hex');
console.log(a)
console.log(a.toString('hex'))
console.log(Object.prototype.toString.call(a))

输出结果:


<Buffer 12 34 56>
123456
[object Uint8Array]

从上面看到,buffer.from返回的是一个8位无符号整数数组。看到这个数据,我就想到了前台js使用的arrayBuffer,果不然后台的buffer是可以和前台arraybuffer是互相转换的。具体的arrarBuffer知识参考:https://blog.csdn.net/swimming_in_IT_/article/details/85052669

//前台js中的arrayBuffer转化成Buffer
function toArrayBuffer(buf) {
    var ab = new ArrayBuffer(buf.length);
    var view = new Uint8Array(ab);
    for (var i = 0; i < buf.length; ++i) {
        view[i] = buf[i];
    }
    return ab;
}
//前台的arrayBuffer转化成Buffer
function toBuffer(ab) {
    var buf = new Buffer(ab.byteLength);
    var view = new Uint8Array(ab);
    for (var i = 0; i < buf.length; ++i) {
        buf[i] = view[i];
    }
    return buf;
}

我还有一个疑问就是后台的buffer是用来存放二进制数据的。而nodejs中的fs文件操作模块都是怎么样用buffer来存储数据的。在流中可以看到其中的数据类型也是8位无符号整数数组。所以存放的数据方式和buffer是一致的,其实nodejs中的文件操作就是对buffer的一定封装,虽然我感觉我说的是废话,但是之前没理清这些关系的时候,反正是一脸懵逼。

let strContent = fs.createReadStream('./content.js')
let dataStr = '';

strContent.on('data',chunk => {
    dd = chunk
    console.log(Object.prototype.toString.call(chunk))//[object Uint8Array]
    dataStr += chunk;
    
})
strContent.on('end', () =>{
    console.log(dd.toString())
    console.log(Object.prototype.toString.call(dataStr))
    //fs.writeFileSync('./copyfile.js',dataStr)
    console.log(dataStr+'流读入完成')
    let strWrite = fs.createWriteStream('outfile.js')
    strWrite.write(dd)
})

在上述创建的流中,在读数据触发的时候,也就是chunk是一个8位无符号整数数组,在进行做dataStr 加的操作的时候,默认将数组转化成了字符串。当然这个前提我们创建的流文件不是二进制文件。如果上述的content.js是一个content.mp3的话,就不能做字符串的追加操作了。

文章写完了,我感觉我好像也没说明白啥,但是把我对二进制的数据,处理,和存储给弄明白了。哎,感觉文章需要被更新,等我下回对这篇文章不懵逼了,再回来改改吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值