为什么 Array 的 Blob 比 Uint8Array 的 Blob 小?

kod*_*odu 3 javascript blob arraybuffer uint8array

我使用读取文件FileReader.readAsArrayBuffer,然后执行如下操作:

  var compressedData = pako.gzip(new Uint8Array(this.result));
  var blob1 = new Blob([compressedData]); // size = 1455338 bytes
  var blob2 = new Blob(compressedData);   // size = 3761329 bytes
Run Code Online (Sandbox Code Playgroud)

例如:如果结果有 4194304 字节,压缩后大小将为 1455338 字节。但由于某种原因, Uint8Array 需要包装在数组中。为什么是这样?

Mát*_*nka 5

比照。BLOB 构造函数的文档:

https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob

[第一个参数] 是一个 ArrayBuffer、ArrayBufferView、Blob、DOMString 对象的数组,或者任何此类对象的混合,将被放入 Blob 中。DOMString 编码为 UTF-8。

我不确定它在幕后是如何工作的,但基本上构造函数期望将一系列内容打包到 BLOB 中。因此,在第一种情况下,您将构建单个部分(即您的 ArrayBuffer)的 BLOB,而在第二种情况下,您将由 1455338 个部分(即每个字节单独)构建它。

由于文档说 BLOB 部分只能是数组或字符串,因此它最终可能会将 ArrayBuffer 内的每个字节值转换为 UTF-8 字符串,这意味着它不是每个数字使用 1 个字节,而是每个十进制数字使用 1 个字节(两个结果大小的比率似乎支持这一点,因为单字节值的长度为 1-3 位,并且较大的 BLOB 大约是较小的 BLOB 大小的 2.5 倍)。这不仅浪费,而且我很确定它还会使您的 ZIP 无法使用。

因此,底线是,第一个版本是正确的方法。