Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么数组的Blob比Uint8Array的Blob小?_Javascript_Blob_Arraybuffer_Uint8array - Fatal编程技术网

Javascript 为什么数组的Blob比Uint8Array的Blob小?

Javascript 为什么数组的Blob比Uint8Array的Blob小?,javascript,blob,arraybuffer,uint8array,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 例如:若结果有4

我使用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

例如:若结果有4194304字节,压缩后的大小将为1455338字节。但出于某种原因,UINT8阵列需要包装在一个数组中。这是为什么?

Cf.BLOB构造函数的文档:

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

我不确定它在引擎盖下是如何工作的,但基本上构造器希望它将一系列东西打包到BLOB中。因此,在第一种情况下,您将构建一个由单个部分组成的BLOB,即您的ArrayBuffer,而在第二种情况下,您将从1455338个部分组成BLOB,即每个字节

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


所以,底线是,第一个版本才是正确的方向。

不幸的是,MDN文章在这里几乎是错误的,充其量只是误导

:

可以使用以下参数调用Blob构造函数:

一个blobpart序列 以任意顺序获取任意数量的以下类型的元素:

缓冲源元素

水滴元素

USVString元素

。。。[BlobPropertyBag,不关我们的事]

所以这里的序列可以是很多东西,从一个数组到一个经过多维数组的集合

然后,算法将遍历该序列,直到找到上面三种类型的元素之一

因此,在您的情况下,TypedArray可以转换为序列。这意味着,当您将其作为直接参数传递时,它将无法看到其ArrayBuffer,算法将遍历其内容并在此处拾取转换为字符串的8位数字的值,这可能不是您所期望的

另一方面,当您通过数组包装Uint8Array时,算法能够找到Uint8Array指向的缓冲源。因此,它将使用它来代替二进制数据,并且可能是您想要的

var arr=新的UINT8阵列25; arr.255; var nowrap=新的Blobarr; var wrapped=新的Blob[arr]; testnowrap,“无包装”; testwrapped,‘wrapped’; 函数testblob,msg{ var reader=新文件读取器; reader.onload=e=>console.logmsg,reader.result; reader.readAsTextblob; }