首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在字符串和ArrayBuffers之间转换

在字符串和ArrayBuffers之间转换
EN

Stack Overflow用户
提问于 2011-08-06 14:01:24
回答 18查看 460.2K关注 0票数 340

是否有一种普遍接受的技术可以有效地将JavaScript字符串转换为ArrayBuffers字符串,反之亦然?具体地说,我希望能够将ArrayBuffer的内容写入localStorage并读回它。

EN

回答 18

Stack Overflow用户

发布于 2012-07-10 18:30:22

您可以使用Encoding standard中的TextEncoderTextDecoder在字符串与ArrayBuffers之间进行相互转换:

代码语言:javascript
复制
var uint8array = new TextEncoder().encode(string);
var string = new TextDecoder(encoding).decode(uint8array);
票数 88
EN

Stack Overflow用户

发布于 2013-12-16 14:12:48

Blob比String.fromCharCode(null,array);慢得多

但是,如果数组缓冲区变得太大,则会失败。我找到的最好的解决方案是使用String.fromCharCode(null,array);,并将其拆分成不会破坏堆栈的操作,但一次要比单个字符更快。

大型数组缓冲区的最佳解决方案是:

代码语言:javascript
复制
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的大字符串。

票数 46
EN

Stack Overflow用户

发布于 2012-03-13 02:53:01

基于gengkev的回答,我创建了两种方式的函数,因为BlobBuilder可以处理字符串和ArrayBuffer:

代码语言:javascript
复制
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());
}

代码语言:javascript
复制
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());
}

一个简单的测试:

代码语言:javascript
复制
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"
            }
        )
    }
)
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6965107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档