当前位置: 首页 > Web前端 > JavaScript

关于ArrayBuffer

时间:2023-03-27 16:37:38 JavaScript

ArrayBuffer什么是ArrayBuffer对象,用于表示原始二进制数据的通用固定长度缓冲区。它是一个字节数组,在其他语言中通常称为“字节数组”。不能直接操作ArrayBuffer的内容,只能通过类型化的数组对象或者DataView对象来操作,这些对象会将缓冲区中的数据表示为特定的格式,通过这些格式来读写缓冲区的内容.简单用法constbuffer=newArrayBuffer(8);console.log(buffer.byteLength);//如果8length大于Number.MAX_SAFE_INTEGER(>=253)或负数,将抛出RangeError异常。**作用是从XHR、FileAPI、Canvas、WebGL等各个地方读取一大串字节流,如果在JS中使用Array来存储,既浪费又低效,所以为了配合这些新的API增强有了JS的二进制处理能力,就有了ArrayBuffer。创建ArrayBuffer时,相当于申请了一块内存。不能(也不方便)直接使用,于是就有了TypedArray,比如Uint32Array、Int16Array、Int8Array、Float32Array等,这些都是用来操作TypedArray的具体实现。TypeArray类型化数组(TypedArray)对象描述了一个底层二进制数据缓冲区(binarydatabuffer)的类数组视图(view)。事实上,不存在名为TypedArray的全局属性,也不存在名为TypedArray的构造函数。相反,有许多不同的全局属性,其值是特定元素类型的类型化数组构造函数,如下所示//下面的代码是语法格式的,不能直接运行,//TypedArray关键字需要替换为列在底部构造函数中的那个。新类型数组();//NewTypedArray(length);newTypedArray(typedArray);newTypedArray(object);newTypedArray(buffer[,byteOffset[,length]]);//TypedArray在ES2017中指的是以下其中之一:Int8Array();Uint8Array();Uint8ClampedArray();Int16Array();Uint16Array();Int32Array();Uint32Array();Float32Array();Float64Array();Unit8Array的意思每个ArrayBuffer一个字节(8位)被视为单个无符号整数(0-255)Unit16Array被表示为一个数字,使用16位(2字节)来表示一个无符号整数(0~2^16-1)数组Int8Array表示用8位表示一个有符号整数(-128~127)Float32Array表示用32位表示一个浮点数。Unit7ClampedArray和Unit8Array一样,范围是0到255,超出范围的处理不同,和图像处理相关(一般像素范围也是0到255)使用场景:文件转换:arrayBuffer可以转换为一个Blob对象:constblob=newBlob([arrayBuffer],{type:"xxx/xxx"});Blob转换为arrayBuffer:constfileReader:FileReader=newFileReader();fileReader.addEventListener("load",(event)=>{constarrayBuffer=event.target.result;//...})fileReader.readAsArrayBuffer(file);或者:constarrayBuffer=awaitfile.arrayBuffer();从ajax获取:varxhr=newXMLHttpRequest();xhr.open('GET','xxxxx');xhr.responseType='arraybuffer';xhr.onload=function(e){if(this.status==200){constarrayBuffer=xhr.response;}};xhr.发送();例1某音频播放方法constaudioContext=newAudioContext();constbuffer=awaitfile.arrayBuffer();常量auidoBuffer=等待audioContext。解码音频数据(缓冲区);constsource=audioContext.createBufferSource();source.buffer=auidoBuffer;source.connect(audioContext.destination);来源.开始();例2读取二进制文件//HTML代码如下//functiontypefile(file){//四个字节处在文件开头生成一个Blob对象letslice=file.slice(0,4);让阅读器=新文件阅读器();//读取这四个字节reader.readAsArrayBuffer(slice);reader.onload=function(e){letbuffer=reader.result;//读取这四个字节字节的内容被认为是一个32位整数letview=newDataView(buffer);让magic=view.getUint32(0,false);//根据文件的前四个字节判断其类型switch(magic){case0x89504E47:file.verified_type='image/png';休息;案例0x47494638:file.verified_type='image/gif';休息;案例0x25504446:file.verified_type='application/pdf';休息;案例0x504b0304:file.verified_type='application/zip';休息;}console.log(file.name,file.verified_type);东西我没有说,比如SharedArrayBuffers,大小端问题等等,如果想深入一点,可以理解前端使用buffer的场景确实很少见,但是你会看到他说到下级还是一点点。这时候我们也需要了解他,比如文档,canvas,WebGL,WASM,EXCEL处理参考https://developer.mozilla.org...https://www.zhihu.com/questio...https://javascript.info/array...https://zhuanlan.zhihu.com/p/...https://developer.mozilla.org...https://zhuanlan.zhihu.com/p/...https://zhuanlan.zhihu.com/p/...