1. ArrayBuffer和TypedArray、DataView的关系

ArrayBuffer存储了固定byte(字节)的raw binary data(原始二进制数据)。不能直接通过ArrayBuffer读取和修改数据。只能通过view(视图)来操作。其他编程语言里有相似的概念,一般叫做byte array(字节数组),可以直接操作,元素值的范围在[0,255]之间,类似于Uint8Array。个人觉得ByteArray比ArrayBuffer这个命名要好。同一ArrayBuffer可以用不同的视图,以不同的“视角”去读写。

1.1 TypedArray是ArrayBuffer的视图

TypedArray是类数组对象,TypedArray里元素值的类型都相同(Array元素值的类型可以不相同)。共有10种具体的TypedArray:

Uint8Array的常见使用场景:

Uint8ClampedArray的元素值被“裁切”限制在[0,255]之间。用它来存储颜色值是个不错的选择。

const u8a=new Uint8Array(3); u8a.fill(256);//[0,0,0] const u8ca=new Uint8ClampedArray(3); u8ca.fill(256);//[255,255,255]

1.2 DataView是ArrayBuffer的另一种视图

2. 如何创建ArrayBuffer

创建ArrayBuffer主要有两种方式:

2.1 通过构造器函数创建

//创建了8个字节长度的ArrayBuffer var buffer=new ArrayBuffer(8);

2.2 通过既有数据转化

比如读取本地文件再转换成ArrayBuffer。

var fileReader = new FileReader(); fileReader.readAsArrayBuffer(file);

3. 举例

MDN上有个稍微复杂的例子—— Working with complex data structures。但这个例子太理论化了。我想做一个更实际的例子——通过ArrayBuffer检测文件的类型(示例只检测了图片类型,可以根据具体情况予以完善,file-type这个js库检测的类型很全面)。算法的核心流程大致如下:

4. 思考题

使用ArrayBuffer做一个简易版的hex editor。可以参考Hex Fiend

5. 参考