由Uint8Array创建的Blob大小数值异常原因咨询
为什么Uint8Array创建的Blob大小是5字节?
这是因为你给Blob构造函数传参的方式不对,导致它没有按你预期的方式处理二进制数据。让我一步步拆解:
问题根源:Blob构造函数的参数要求
Blob的第一个参数应该是一个包含BlobPart类型的数组(比如ArrayBuffer、TypedArray、Blob、字符串等),而不是直接传入单个TypedArray。当你直接传x(Uint8Array实例)时,JavaScript会把它当成一个可迭代对象,遍历它的每个元素——也就是那两个数字255和10。
背后的逻辑:数字转字符串的字节计算
对于遍历到的每个数字,Blob会自动把它转换成对应的字符串,然后将这些字符串作为独立的内容片段拼接起来:
- 数字
255转成字符串是"255",UTF-8编码下占3字节 - 数字
10转成字符串是"10",UTF-8编码下占2字节 - 两者加起来就是
3+2=5字节,这就是你看到的Blob size。
这也解释了为什么修改x[0]或x[1]的值会改变Blob的大小:比如你把x[0]改成1,对应的字符串是"1"(1字节),x[1]改成2,字符串是"2"(1字节),此时Blob size就会变成1+1=2字节。
正确的写法:让Blob识别二进制数据
要让Blob正确处理TypedArray的二进制内容,你需要把它放到一个数组里传入:
var x = new Uint8Array(2); x[0] = 255; x[1] = 10; console.log("Typed array length is " + x.length + ".") console.log("Typed array byte length is " + x.byteLength + ".") console.log("Blob size is " + new Blob([x]).size + ' "bytes".') // 输出2字节
这样Blob就会把整个Uint8Array当成二进制数据处理,size就和x.byteLength完全一致了。
内容的提问来源于stack exchange,提问作者D. Pardal
相关产品推荐
相关产品推荐

