|
二进制数组可分为以下三类对象
ArrayBuffer对象
Js可以通过下面的两种视图对象(TypedArray, DataView)来对ArrayBuffer进行操作:将缓冲区中的数据表示为特定的格式,然后通过这些特定的格式来读写缓冲区内容
TypedArray 视图
DataView 视图
-
相比于前者,DataView是可以自定义格式的视图,因此它可以用来读写类型更复杂的二进制数据 -
提供更多的操作选项,支持设定字节序(大端或者小端) -
语法 new DataView(ArrayBuffer buffer [, 字节起始位置 [, 长度]]);
//栗子
const buffer = new ArrayBuffer(24);
const dv = new DataView(buffer);
-
总结一下上面三个,ArrayBuffer就是内存中一段原始的01串,而为了操作它,我们可以使用TypedArray或DataView,把这段01串分开一段段装到特定格式的小盒子里面(视图),然后对盒子里的数据进行操作,这里盒子之间也是可以重合的,也被称为复合视图
接下来我们来讲将另一个API
Blob
Binary Large Object ,Blob 对象表示一个不可变、原始数据的类文件对象
类比string

type(默认值为""),表示MIME类型endings(默认值为“transparent"),用于指定行结束符\n如何处理
File
-
File对象
- 继承自Blob,将其扩展使得它能够支持用户系统上的文件
- 多了一个lastModified属性表示修改时间
- 同样可以使用构造函数
-
FileList
-
包含File文件集合的list,通常来自的files属性 -
比如我们可以在指定multiple来多选文件,然后通过数组下标来获取对应的File对象 -
<input type="file" id="myfileinput" multiple>
-
const fileInput = document.getElementById("myfileinput")
// files 是一个 FileList 对象(类似于NodeList对象)
const files = fileInput.files
for (var i = 0; i file = files[i] //或者这样写:file = files.item(i);
console.log(file.name)
}
-
使用files,就要用到接下来要将的FileReader了
-
FileReader
readAsArrayBufferreadAsTextreadAsDataURL- 补充,
base64编码相关 - 基于 64 个可打印字符来表示二进制数据
- 每6个比特为一个单元,对应一个字符(2的6次方)
- 可以用
btoa(), atob()函数进行转换(ASCII和Blob) - 用来读取
File和Blob对象的内容 - 异步读取,可以在
onload的result属性中拿到结果 - 常用的
readAsDataURL方法拿到的是base64编码的字符串 - 除此之外,还有
- 因此,我们可以很方便地使用
FileReader来进行我们需要的转化,例如后文要提到的将ArrayBuffer转化为Blob -
FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。 其中File对象可以是来自用户在一个<input>元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。
比较&转化
-
ArrayBuffer & Blob
-
表示不可变的类似文件对象的原始数据,(影像、声音或多媒体文件) - 可以位于磁盘、高速缓存内存和其他不可用的位置
- 还有重要的一点:
Blob是不可变的 - 在需要写入的时候,我们通常会使用
ArrayBuffer,其它情况用的更多的是Blob -
表示通用的,固定长度的原始二进制数据缓冲区(是存在内存中的) * 可以通过视图进行操作 -
ArrayBuffer在使用时也更接近真实的二进制,更底层 -
ArrayBuffer -
Blob
-
二者可以相互转化
-
ArrayBuffer转Blob -
const blob = new Blob([1,2,3,4,5]);
const reader = new FileReader(); //借助FileReader对象
reader.onload = function() {
console.log(this.result);
}
reader.readAsArrayBuffer(blob); //这里将blob转化成了ArrayBuffer类型
-
Blob转ArrayBuffer -
const buffer = new ArrayBuffer(8)
const blob = new Blob([buffer]) //这里通过构造函数产生一个blob对象
-
DataURL&ObjectURL
- 其中
mediatype是表示MIME类型的字符串,默认值为"text/plain;charset=US-ASCII" BlobURL的格式是blob:域名/uuidDataURL的格式是data:[[;base64],- 前者长度往往更短,因为后者的数据中存储着图片的
base64编码 - 我们可以直接将
DataURL复制到浏览器地址栏进行访问,但BlobURL则不能
|