我有一个纯 Uint8Array,我想保存到一个 blob 中,我可以使用任何类型(“text/plain”、application/octet-stream 等)创建该 blob。
var a_blob = new Blob(Uint8Array,{type: whatever});
Run Code Online (Sandbox Code Playgroud)
后来测试我的结果:
this.read_blob = function (blob) {
var reader = new FileReader();
reader.onloadend = function (evt)
{ var full_buffer = evt.target.result; }
reader.readAsArrayBuffer(blob);
}
Run Code Online (Sandbox Code Playgroud)
我已经存储了 1 219 2 0 值(使用 Uint32Array 的 4 个值),并且我已检查一切正确。
现在,我有:(我想检查 blob 值)
var data = new Uint32Array (full_buffer,0,4);
Run Code Online (Sandbox Code Playgroud)
我有:0:808464433 1:809054514 2:808464432 3:808464432 ????????????
如果我使用:
var data = new Uint8Array (full_buffer,0,4);
Run Code Online (Sandbox Code Playgroud)
我有: [49,48,48,48,50,49,57,48,48,...] 这是 1 0 0 0 2 1 9 0 .... 的 ascii 代码(我的字符串表示价值观……)
我做什么坏事了?也许 blob 并没有真正保存为纯二进制数据?fullbuffer 是二进制字符串对象吗?我必须使用特定类型吗?我必须以不同的方式读取缓冲区吗?必须在循环中创建一个关联 full_buffer 单个数据的 Uint8Array 吗?
解决了
正如MDN所解释的:要创建 blob,您必须使用
blob = new Blob(部分,类型); part = 要放入新 Blob 对象中的数据对象数组。
因此,修复方法(不容易发现,因为你一次又一次地看到数组、bufferarray、typedarrays...并且你感到困惑)是使用 [] 括号动态创建一个元素数组。
所以代替:
var a_blob = new Blob(Uint8Array,{type: whatever});
Run Code Online (Sandbox Code Playgroud)
使用
var a_blob = new Blob([Uint8Array],{type: whatever});
Run Code Online (Sandbox Code Playgroud)
相信我,经过大量网络搜索后,您可以看到帖子,其中您可以看到带或不带括号的 blob 创建