2016-05-15 178 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]