Javascript ArrayBuffer和Blob之间有什么区别?
我正在阅读并试图找出Javascript ArrayBuffer和Blob之间有什么区别?,javascript,html,Javascript,Html,我正在阅读并试图找出ArrayBuffer和Blob之间的区别 两个容器不是都由比特组成吗?因此,这两个容器不能以多种方式查看(如32位块、16位块等)?页面对此进行了解释 阵列缓冲器 ArrayBuffer是二进制数据的通用固定长度容器。如果您需要原始数据的通用缓冲区,它们非常方便,但是这些家伙背后的真正力量是您可以使用JavaScript类型的数组创建底层数据的“视图”。事实上,可以从单个ArrayBuffer源创建多个视图。例如,您可以创建一个8位整数数组,该数组与来自相同数据的现有32位
ArrayBuffer
和Blob
之间的区别
两个容器不是都由比特组成吗?因此,这两个容器不能以多种方式查看(如32位块、16位块等)?页面对此进行了解释 阵列缓冲器 ArrayBuffer是二进制数据的通用固定长度容器。如果您需要原始数据的通用缓冲区,它们非常方便,但是这些家伙背后的真正力量是您可以使用JavaScript类型的数组创建底层数据的“视图”。事实上,可以从单个ArrayBuffer源创建多个视图。例如,您可以创建一个8位整数数组,该数组与来自相同数据的现有32位整数数组共享相同的ArrayBuffer。底层数据保持不变,我们只是创建了它的不同表示 斑点 如果您想直接使用Blob和/或不需要操作文件的任何字节,请使用xhr.responseType='Blob':
摘要 除非您需要编写/编辑(使用
ArrayBuffer
)的能力,否则Blob
格式可能是最好的
细节
我是从一个地方来问这个问题的,我发现这很有帮助,所以我想把他们提升到一个答案上来
我还发现查找特定于ArrayBuffer
和Blob
对象的资源很有帮助。我添加了重点,以重申我正在寻找的有用细节。总之:尽管强调Blob
是不可变的,但“原始数据”Blob很容易处理
关于ArrayBuffer
vsBlob
的一些其他观点:
- 易变性
- 可以更改阵列缓冲区(例如,使用数据视图)
- Blob是不可变的
- 内存中的源/可用性
- 引述:
- 内存中有一个数组缓冲区,可用于操作
- Blob可以位于磁盘、缓存内存和其他不易获得的位置
- 接入层
- ArrayBuffer需要一些访问层
- Blob可以直接传递到其他函数中,如中的示例所示
- 但是,您可能仍然需要与文件相关的API,如
来处理BlobFileReader
- 皈依
- 可以将Blob转换为ArrayBuffer,反之亦然,这解决了OP的“两个容器不是都由位组成吗?”
- 阵列缓冲区可以从Blob或生成(感谢@Darren G)
- Blob可以从ArrayBuffer生成
新Blob([new Uint8Array(data)]代码>,如中所示
- 在其他图书馆使用
- )
接受(new JSZip()).loadAsync(…)
和ArrayBuffer
:Blob
String/ArrayBuffer/Uint8Array/Buffer/Blob/Promise
- )
- 协议如何处理ArrayBuffer与Blob
- Websocket(又名WS/WSS)
- 使用(可能有值“arraybuffer”或“blob”)来“控制通过WebSocket连接接收的二进制数据的类型”
- XmlHttpRequest(又名XHR)
- 使用to“更改服务器的预期响应类型”(有效值包括“arraybuffer”、“blob”和其他值,如“document”、“json”和“text”)
- response属性将根据responseType包含实体主体,如ArrayBuffer、Blob、Document、JSON或字符串
- Websocket(又名WS/WSS)
嗯,但是你不能以不同的方式来看待它们吗?因为它们本质上都是比特的容器?当然。。但我猜ArrayBuffer有现成的功能吗?BLOB可以是任何东西,ArrayBuffer是定义良好的结构。啊,好吧,所以ArrayBuffer只是公开了一个接口来实现这一点。老实说,仍然不清楚。你所说的“一团可以是任何东西”是什么意思。它不只是一个字节序列吗,就像ArrayBuffer一样?ArrayBuffer在内存中,可供操作。Blob可以位于磁盘、缓存内存和其他不可用的位置。但是Blob中的数据可以复制到ArrayBuffer中。正如我刚刚发现的,当我从websocket得到二进制响应时,你会在那里得到一个Blob,而Blob的缺点似乎是你甚至无法读取它。只是个把手。我需要从那个blob中获取一些字节。您需要创建一个
文件读取器
,请参见-它添加了另一个异步函数,然后才能从Blob访问任何内容。arrayBuffer
可以转换为Blob
,如下所述:新建Blob([new Uint8Array(data)]代码>我对它进行了测试,它适用于PNG图像。@Mörre您可以对一个blob进行切片,以返回一个只包含所需字节的新blob,然后读取它。如果您想要真正的性能,那么workers支持同步文件读取,您可以