【问题标题】:What is the difference between an ArrayBuffer and a Blob?ArrayBuffer 和 Blob 有什么区别?
【发布时间】:2012-08-05 23:49:00
【问题描述】:

我正在阅读http://www.html5rocks.com/en/tutorials/file/xhr2/ 并试图找出ArrayBufferBlob 之间的区别。

不是两个容器都是由比特组成的吗?因此,不能以多种方式查看两个容器(如 32 位块、16 位块等)吗?

【问题讨论】:

  • ArrayBuffer(及其视图,例如DataView类型化数组)用于二进制数据,@ 987654326@ 用于二进制文件
  • 另一个答案更好。

标签: javascript html


【解决方案1】:

总结

除非您需要编写/编辑能力(使用ArrayBuffer),否则Blob 格式可能是最好的

详情

我从different html5rocks page. 提出这个问题,我发现@Bart van Heukelom's comments 很有帮助,所以我想在这里将它们提升为答案。

我还找到了特定于 ArrayBufferBlob 对象的有用资源。总之:尽管强调 Blob 是不可变的/“原始数据”Blob 对象易于使用

比较/对比ArrayBufferBlob的资源:

  • 可变性
    • ArrayBuffer 可以更改(例如,DataView
    • Blob不可变的
  • 内存中的源/可用性
    • ArrayBuffer 位于内存中,可供操作。
    • Blob 可以位于磁盘、缓存内存和其他不容易获得的地方
  • 访问层
  • 转换
  • 在其他库中使用
    • jsZip; (new JSZip()).loadAsync(...) 接受 两者 ArrayBufferBlob: String/Array of bytes/ArrayBuffer/Uint8Array/Buffer/Blob/Promise
  • 协议如何处理 ArrayBuffer 与 Blob
    • Websocket(又名 WS / WSS)
      • 使用webSocket's binaryType property(可以有值“arraybuffer”或“blob”)来“控制通过 WebSocket 连接接收的二进制数据的类型。”
    • XmlHttpRequest(又名 XHR)
      • 使用xhr's responseType property 来“更改来自服务器的预期响应类型”(有效值包括“arraybuffer”、“blob”以及“document”、“json”和“text”等其他值)李>
      • 响应属性将包含实体主体根据responseType,作为 ArrayBuffer、Blob、Document、JSON 或字符串。

其他有用的文档:

ArrayBuffer 对象用于表示一个通用的、固定长度的 原始二进制数据缓冲区。您不能直接操作 一个ArrayBuffer;相反,您创建一个类型化的数组对象或 一个DataView 对象,它以特定格式表示缓冲区, 并使用它来读取和写入缓冲区的内容。

Blob 对象表示不可变、原始数据的类文件对象。 Blob 表示不一定是 JavaScript 原生的数据 格式。 File接口基于Blob,继承blob 功能并将其扩展为支持用户系统上的文件。

【讨论】:

  • 正如我刚刚发现,当我从 websocket 收到二进制响应时,你会在那里得到一个 Blob - 而 Blob 的缺点似乎是 你甚至无法阅读它 .这只是一个把手。我需要从那个 blob 中获取几个字节。您需要创建一个 FileReader,参见 "Example for extracting data from a Blob" here - 它添加了另一个异步函数,然后您才能从 Blob 访问任何内容。
  • arrayBuffer 可以转换为Blob,正如this answer 中提到的那样:new Blob([new Uint8Array(data)]); 我测试了它,它适用于 PNG 图像。
  • @Mörre 您可以对一个 blob 进行切片以返回一个仅包含所需字节的新 blob,然后读取它。如果您想要真正的性能,那么工作人员支持同步文件读取,并且您可以几乎立即在工作人员和窗口进程之间转移(而不是克隆)ArrayBuffers 的所有权
  • A Blob 也可以通过异步方法 blob.arraybuffer() 转换为 ArrayBuffer,例如const buffer = await blobFile.arrayBuffer()developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBuffer
  • “Blob 可以变成”不,正如你之前所说,它是不可变的,所以它不能变成任何东西。您可以从 Blob 生成 ArrayBuffer,或从 ArrayBuffer 生成 Blob,但在这两种情况下,您都复制了数据,没有任何东西会变成其他东西。
【解决方案2】:

页面上有说明。

数组缓冲区

ArrayBuffer 是二进制数据的通用固定长度容器。如果您需要一个通用的原始数据缓冲区,它们非常方便,但这些家伙背后的真正力量是您可以使用 JavaScript 类型数组创建基础数据的“视图”。事实上,可以从单个 ArrayBuffer 源创建多个视图。例如,您可以创建一个 8 位整数数组,它与来自相同数据的现有 32 位整数数组共享相同的 ArrayBuffer。底层数据保持不变,我们只是创建了不同的表示形式。

BLOB

如果您想直接使用 Blob 和/或不需要操作文件的任何字节,请使用 xhr.responseType='blob':

【讨论】:

  • 嗯,但由于它们本质上都是比特容器,您不能以不同的方式查看它们吗?
  • 当然 .. 但我猜 ArrayBuffer 有现成的功能吗? BLOB 可以是任何东西,ArrayBuffer 是定义明确的结构。
  • 说实话还不清楚。 “BLOB 可以是任何东西”是什么意思?不就是一个字节序列,和ArrayBuffer一样吗?
  • 一个 ArrayBuffer 在内存中,可用于操作。 Blob 可以位于磁盘上、高速缓存中以及其他不易获得的位置。但是可以将 Blob 中的数据复制到 ArrayBuffer 中。
  • @BartvanHeukelom,需要引用。
猜你喜欢
  • 2016-08-10
  • 2013-02-16
  • 2011-09-01
  • 1970-01-01
  • 2012-05-11
  • 2011-12-08
  • 2012-07-22
  • 2010-10-02
相关资源
最近更新 更多