是否有一种普遍接受的技术可以有效地将JavaScript字符串转换为ArrayBuffers,反之亦然?具体来说,我希望能够将ArrayBuffer的内容写入localStorage并将其读回.
我正在研究Blob,我注意到当你有一个ArrayBuffer时,你可以很容易地将它转换为Blob,如下所示:
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,是否可以从Blob转到ArrayBuffer?
我一直在玩一些JS加密库(CryptoJS,SJCL),并发现了与Blob/File API和JavaScript"二进制字符串"相关的问题.
我意识到加密甚至不是真正相关的,所以这是一个非常简化的场景.只需使用readAsBinaryString读取文件,然后创建一个Blob:
>>> reader.result
"GIF89a????ÿÿÿÿÿÿ!þCreated with GIMP?,???????D?;"
>>> reader.result.length
56
>>> typeof reader.result
"string"
>>> blob = new Blob([reader.result], {type: "image/gif"})
Blob { size=64, type="image/gif", constructor=function(), more...}
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个基本上可以执行上述操作的JSFiddle:它只是读取任意文件,从中创建一个blob,并输出长度与大小:http: //jsfiddle.net/6L82t/1/
看来,当从"二进制(javascript)字符串"创建Blob时,具有字符编码的内容最终会重置结果.
如果使用非二进制文件,您将看到Blob和原始二进制字符串的长度相同.
因此,当尝试从非纯文本Javascript字符串创建Blob /文件时会发生一些事情,我需要任何不会发生的事情.我认为它可能与JS字符串是UTF-16的事实有关?
这里有一个(可能)相关的线程: HTML5文件API读作文本和二进制
在将它们放入Blob/File之前,我是否需要获取解密结果(UTF-16)并将它们"转换"为UTF-8?
与Freenode上的#html5中的某个人一起工作,我们确定如果你直接读取一个ArrayBuffer,然后通过首先使用Uint8Array创建blob,那么字节就可以正常工作了.您可以在这里看到一个基本上可以做到的小提琴:http: //jsfiddle.net/GH7pS/4/
问题是,至少在我的场景中,我将最终得到一个二进制字符串,并想弄清楚如何将其直接转换为Blob,以便我可以使用html5的下载允许用户点击下载blob直接.
谢谢!
我试图使用FileReader readAsArrayBuffer属性读取本地文件.读取成功,在"onload"回调中,我在reader.result中看到了Array Buffer对象.但是Array Buffer只是空的.设置长度,但不设置数据.我如何获得这些数据?
这是我的代码
<!DOCTYPE html>
<html>
<body>
<input type="file" id="file" />
</body>
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
var selFile = files[0];
var reader = new FileReader();
reader.onload = function(e) {
console.log(e.target.result);
};
reader.onerror = function(e) {
console.log(e);
};
reader.readAsArrayBuffer(selFile);
}
document.getElementById('file').addEventListener('change', handleFileSelect, false);
</script>
</html>
Run Code Online (Sandbox Code Playgroud)
reader.result的控制台输出
e.target.result
ArrayBuffer {}
e.target.result.byteLength
25312
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何获取这些数据?有一些安全问题吗?没有错误,不执行onerror.
来自评论:你能告诉我如何访问缓冲区内容吗?我实际上正在尝试播放音频文件AudioContext...为此我需要缓冲数据...