ArrayBuffer
基本的二进制对象,是对 “固定长度的连续内存空间” 的引用,代表原始的二进制数据,是核心对象,是所有的基础
语法
let buffer = new ArrayBuffer(n)
它会分配一个 n 字节的连续内存空间,并用 0 进行预填充
- 长度固定
- 要操作 ArrayBuffer,需要使用“视图”对象(TypedArray 或 DataView)
TypedArray
ArrayBuffer 只是原始的二进制数据,需要透过它来解释存储在 ArrayBuffer 中的字节,相当于读取二进制数据的工具
可以有多种视图方式进行解读:
Int8Array
:将每 1 个字节视为有符号整型,-128 ~ 127Uint8Array
:将每 1 个字节视为无符号整型,0 ~ 255Uint16Array
:将每 2 个字节视为一个 0 ~ 65535Uint32Array
:将每 4 个字节视为一个 0 ~ 4294967295Float64Array
:将每 8 个字节视为一个双精度浮点数- …
创建
let arrView = new TypedArray( ... )
// TypedArray 是一个代称,实际使用时必须指明具体的类型
读取
具有大部分常规的 Array 方法
写入
arrView.set(arr)
DataView
一种更加灵活地读写 ArrayBuffer 的视图对象
创建
let dataview = new DataView( buffer )
读取/写入
灵活读取和写入,dataview.getXxx()
,dataview.setXxx()
TypedArray 和 DataView 的区别
TypedArray | DataView | |
---|---|---|
区别 1 | 创建时确定数据格式 | 读取/写入时才确定数据格式 |
区别 2 | 创建时可以传入多种内容形式 | 创建时只能传入 ArrayBuffer |
总结
BufferSource :是“任何类型的二进制数据” —— ArrayBuffer 或其上的视图(都属于 ECMA 标准)
字符串
TextDecoder
将二进制数据解码为字符串
- 创建一个解码器:
let decoder = new TextDecoder(utfLabel, options)
- 进行解码:
let str = decoder.decode([input], [options])
(input:要被解码的 BufferSource)
TextEncoder
将字符串转换为 Uint8Array 对象
- 创建一个编码器:
let encoder = new TextEncoder()
(只支持 utf-8 编码) - 进行编码:
let uint8Array = encoder.encode( str )
(编码为 Uint8Array)
Blob
Binary Large Object:表示一个不可变、原始数据的类文件对象,是 “有类型的二进制数据”(Blob 是浏览器中的规范)
创建
new Blob( blobParts, options )
(blobParts:Blob/BufferSource/String 类型的值的数组)
用途
- 用作 URL,预览或下载文件(很容易用作
<a>
、<img>
或其他标签的 URL)
NOTE
Blob 对象是不可改变的,无法直接在 Blob 中更改数据,但可以通过 slice 获得 Blob 的多个部分,从这些部分创建新的 Blob 对象
File
File 对象继承自 Blob,并扩展了与文件系统相关的功能(如 name 和 lastModified)
创建
- 构造函数:
new File(bitsArr, fileName[, options])
(fileParts:Blob/BufferSource/String 类型值的数组) - input 标签:
<input type="file">
- 拖拽产生的
DataTransfer
对象
FileReader
FileReader 是一个对象,其唯一用途是从 Blob(因此也从 File)对象中读取数据
创建
let reader = new FileReader()
// 没有参数
使用
- 按照不同方式进行读取
readAsArrayBuffer(blob)
:将数据读取为二进制格式的 ArrayBufferreadAsText(blob, [encoding])
:将数据读取为给定编码(默认为 utf-8 编码)的文本字符串readAsDataURL(blob)
:读取二进制数据,并将其编码为 base64 的 data url
- 监听 load 事件,读取
reader.result
获得结果
Base64
是一种基于 64 个可打印字符来表示二进制数据的表示方法 (Base64 版本通常比其原来的内容大小增加约三分之一)
编解码
window.btoa()
:从二进制数据字符串创建一个 Base64 编码的 ASCII 字符串window.atob()
:解码通过 Base64 编码的字符串数据
a:ASCII
b:binary