arraybuffer操作_JavaScript中的ArrayBuffer详细介绍

本文详细介绍了JavaScript中的ArrayBuffer,它是处理二进制数据的基础。不同于常规的Array,ArrayBuffer是一个原始的二进制数据缓冲区,不能直接操作,需要通过类型化数组或DataView进行读写。文章讲解了ArrayBuffer的创建、切片、数据化数组如Float32Array的使用,以及DataView的细粒度操作,并提到了ArrayBuffer在WebSocket、WebAudio和Ajax等场景中的应用。
摘要由CSDN通过智能技术生成

相信每一个 javascript 学习者,都会去了解 JS 的各种基本数据类型,数组就是数据的组合,这是一个很基本也十分简单的概念,他的内容没多少,学好它也不是件难事情。但是本文着重要介绍的并不是我们往常看到的 Array,而是 ArrayBuffer。

我写的很多东西都是因为要完成某些特定的功能而刻意总结的,可以算是备忘,本文也是如此!前段时间一直在研究 Web Audio API 以及语音通信相关的知识,内容侧重于音频流在 AudioContext 各个节点之间的流动情况,而现在要摸清楚音频到流底是个什么样的数据格式,所以对 ArrayBuffer 的研究就显得格外重要了。

Array 在内存中的堆栈模型

Array 的获取

Javascript 中如何产生 Array:

[element0, element1, ..., elementN]

new Array(element0, element1, ..., elementN)

new Array(arrayLength)

直接定义,或者通过构造函数创建一个 Array,当然也可以使用其他的手段:

"array".split("");

"array".match(/a|r/g);

等等,方式有很多。但是 Array 内部是个什么样的结构,恐怕很多人还不是很清楚。

堆栈模型

在数组中我们可以放很多不同数据类型的数据,如:

var arr = [21, "李靖", new Date(), function(){}, , null];

上面这个数组中一次放入了 数字、字符串、对象、函数、undefined 和 null,对于上面的数据接口我们可以具象的描述下:

+---------+                  堆

|   21    |         +-------------------+

+---------+         |                   |

|  "李靖" |         |                   |

+---------+         |  +--------+       |

| [refer] |----------->| Object |       |

+---------+         |  +--------+       |

| [refer] |----------------->+--------+ |

+---------+         |        |function| |

|undefined|         |    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用ArrayBuffer解析文件属性详细信息,可以按照以下步骤: 1. 使用FileReader对象读取文件。例如: ```javascript var reader = new FileReader(); reader.onload = function(event) { var arrayBuffer = event.target.result; // 在这里解析arrayBuffer }; reader.readAsArrayBuffer(file); ``` 其,file是指要解析的文件对象。 2. 解析arrayBuffer。具体的解析方式取决于文件类型和需要解析的属性。以下是一些示例: - 解析图片文件的宽度和高度: ```javascript var dataView = new DataView(arrayBuffer); var offset = 0; if (dataView.getUint16(offset) == 0xFFD8) { offset += 2; while (offset < dataView.byteLength) { if (dataView.getUint16(offset) == 0xFFE1) { offset += 2; if (dataView.getUint32(offset) != 0x45786966) { return; } offset += 6; var width = dataView.getUint16(offset, false); offset += 2; var height = dataView.getUint16(offset, false); console.log("宽度:" + width + ",高度:" + height); return; } else { offset += dataView.getUint16(offset); } } } ``` 以上代码可以解析JPEG格式的图片文件的宽度和高度。具体的解析过程参考了Exif标准。 - 解析音频文件的时长: ```javascript var dataView = new DataView(arrayBuffer); var offset = 0; while (offset < dataView.byteLength) { if (String.fromCharCode(dataView.getUint8(offset)) == "t" && String.fromCharCode(dataView.getUint8(offset + 1)) == "r" && String.fromCharCode(dataView.getUint8(offset + 2)) == "a" && String.fromCharCode(dataView.getUint8(offset + 3)) == "k") { offset += 4; var duration = dataView.getUint32(offset) / dataView.getUint32(offset + 4); console.log("时长:" + duration + "秒"); return; } else { offset += 1; } } ``` 以上代码可以解析MP3格式的音频文件的时长。具体的解析过程参考了ID3v2标准。 - 解析视频文件的分辨率和编码格式: ```javascript var dataView = new DataView(arrayBuffer); var offset = 0; while (offset < dataView.byteLength) { if (dataView.getUint32(offset) == 0x66747970) { // "ftyp" var majorBrand = String.fromCharCode(dataView.getUint8(offset + 8)) + String.fromCharCode(dataView.getUint8(offset + 9)) + String.fromCharCode(dataView.getUint8(offset + 10)) + String.fromCharCode(dataView.getUint8(offset + 11)); console.log("主要品牌:" + majorBrand); if (majorBrand == "mp41" || majorBrand == "mp42") { var width = dataView.getUint16(offset + 24); var height = dataView.getUint16(offset + 26); console.log("分辨率:" + width + "x" + height); return; } else { return; } } else { offset += 1; } } ``` 以上代码可以解析MP4格式的视频文件的分辨率和编码格式。具体的解析过程参考了ISO Base Media File Format标准。 注意,以上代码只是示例,具体的解析过程可能会更加复杂,需要根据文件类型和需要解析的属性进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值