2016-05-15 132 views
0

这个问题已经收到过去的答案,但我肯定会说它仍然没有回答。ArrayBuffer to String,String to ArrayBuffer方法

几乎有关于ArrayBuffers的文档,更不用说特定的应用程序了。我一直在研究几天,对此无济于事。

本质上我需要尝试将我从文件读取器(此处:https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer)获得的ArrayBuffer转换为字符串,然后将该字符串转换回相同的ArrayBuffer。

我尝试了这些方法,例如

function ab2str(buf) { 
    return String.fromCharCode.apply(null, new Uint16Array(buf)); 
} 

function str2ab(str) { 
    var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char 
    var bufView = new Uint16Array(buf); 
    for (var i=0, strLen=str.length; i<strLen; i++) { 
    bufView[i] = str.charCodeAt(i); 
    } 
    return b 

我得到以下错误:“Uint16Array的字节长度应该是2的倍数”

我也试过以下

function StringToUint8Array(string) { 
    var binary, binLen, buffer, chars, i, _i; 
    binary = StringToBinary(string); 
    binLen = binary.length; 
    buffer = new ArrayBuffer(binLen); 
    chars = new Uint8Array(buffer); 
    for (i = _i = 0; 0 <= binLen ? _i < binLen : _i > binLen; i = 0 <= binLen ? ++_i : --_i) { 
     chars[i] = String.prototype.charCodeAt.call(binary, i); 
    } 
    return chars; 
} 

function ArrayBufferToString(buffer) { 
    return BinaryToString(String.fromCharCode.apply(null, Array.prototype.slice.apply(new Uint8Array(buffer)))); 
} 

function StringToArrayBuffer(string) { 
    return StringToUint8Array(string).buffer; 
} 

function BinaryToString(binary) { 
    var error; 

    try { 
     return decodeURIComponent(escape(binary)); 
    } catch (_error) { 
     error = _error; 
     if (error instanceof URIError) { 
      return binary; 
     } else { 
      throw error; 
     } 
    } 
} 

function StringToBinary(string) { 
    var chars, code, i, isUCS2, len, _i; 

    len = string.length; 
    chars = []; 
    isUCS2 = false; 
    for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { 
     code = String.prototype.charCodeAt.call(string, i); 
     if (code > 255) { 
      isUCS2 = true; 
      chars = null; 
      break; 
     } else { 
      chars.push(code); 
     } 
    } 
    if (isUCS2 === true) { 
     return unescape(encodeURIComponent(string)); 
    } else { 
     return String.fromCharCode.apply(null, Array.prototype.slice.apply(chars)); 
    } 
} 

并收到此错误:超出了最大调用堆栈大小

似乎没有好的方法进行以下转换:AB - > String ||字符串 - > AB

+0

您可以显示您使用的示例输入吗?第一个代码工作正常lorem ipsum。 – Qwerty

+0

我上传图像文件,使用filereader读取为arraybuffer,然后将内容发送到ab2str –

+0

也许文件大小太大,会导致更多的调用堆栈? –

回答

0

有一种使用Blob和FileReader的异步方式。

您可以指定任何有效的编码。

function arrayBufferToString(buffer, encoding, callback) { 
    var blob = new Blob([buffer],{type:'text/plain'}); 
    var reader = new FileReader(); 
    reader.onload = function(evt){callback(evt.target.result);}; 
    reader.readAsText(blob, encoding); 
} 

function stringToArrayBuffer(string, encoding, callback) { 
    var blob = new Blob([string],{type:'text/plain;charset='+encoding}); 
    var reader = new FileReader(); 
    reader.onload = function(evt){callback(evt.target.result);}; 
    reader.readAsArrayBuffer(blob); 
} 


//example: 
var buf = new Uint8Array([65,66,67]); 
arrayBufferToString(buf, 'UTF-8', console.log.bind(console)); //"ABC" 

stringToArrayBuffer('ABC', 'UTF-8', console.log.bind(console)); //[65,66,67]