是否有一种普遍接受的技术可以有效地将JavaScript字符串转换为ArrayBuffers字符串,反之亦然?具体地说,我希望能够将ArrayBuffer的内容写入localStorage
并读回它。
发布于 2012-07-10 18:30:22
您可以使用Encoding standard中的TextEncoder
和TextDecoder
在字符串与ArrayBuffers之间进行相互转换:
var uint8array = new TextEncoder().encode(string);
var string = new TextDecoder(encoding).decode(uint8array);
发布于 2013-12-16 14:12:48
Blob比String.fromCharCode(null,array);
慢得多
但是,如果数组缓冲区变得太大,则会失败。我找到的最好的解决方案是使用String.fromCharCode(null,array);
,并将其拆分成不会破坏堆栈的操作,但一次要比单个字符更快。
大型数组缓冲区的最佳解决方案是:
function arrayBufferToString(buffer){
var bufView = new Uint16Array(buffer);
var length = bufView.length;
var result = '';
var addition = Math.pow(2,16)-1;
for(var i = 0;i<length;i+=addition){
if(i + addition > length){
addition = length - i;
}
result += String.fromCharCode.apply(null, bufView.subarray(i,i+addition));
}
return result;
}
我发现这比使用blob快20倍。它也适用于超过100mb的大字符串。
发布于 2012-03-13 02:53:01
基于gengkev的回答,我创建了两种方式的函数,因为BlobBuilder可以处理字符串和ArrayBuffer:
function string2ArrayBuffer(string, callback) {
var bb = new BlobBuilder();
bb.append(string);
var f = new FileReader();
f.onload = function(e) {
callback(e.target.result);
}
f.readAsArrayBuffer(bb.getBlob());
}
和
function arrayBuffer2String(buf, callback) {
var bb = new BlobBuilder();
bb.append(buf);
var f = new FileReader();
f.onload = function(e) {
callback(e.target.result)
}
f.readAsText(bb.getBlob());
}
一个简单的测试:
string2ArrayBuffer("abc",
function (buf) {
var uInt8 = new Uint8Array(buf);
console.log(uInt8); // Returns `Uint8Array { 0=97, 1=98, 2=99}`
arrayBuffer2String(buf,
function (string) {
console.log(string); // returns "abc"
}
)
}
)
https://stackoverflow.com/questions/6965107
复制相似问题