Javascript 为什么数组的Blob比Uint8Array的Blob小?
我使用FileReader.readAsArrayBuffer读取文件,然后执行以下操作: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
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; }