最近一直对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的话,就不能做字符串的追加操作了。
文章写完了,我感觉我好像也没说明白啥,但是把我对二进制的数据,处理,和存储给弄明白了。哎,感觉文章需要被更新,等我下回对这篇文章不懵逼了,再回来改改吧