2013-05-03 3 views
11

Каков способ получения двоичной строки из ArrayBuffer в JavaScript?Как получить двоичную строку из ArrayBuffer?

Я не хочу кодировать байты, просто получаю двоичное представление как String.

Заранее благодарен!

+0

Я не в полной мере понять, что преобразование вы на самом деле пытаетесь достичь, вы можете дать некоторые дополнительные пояснения к уточнить, что вы хотите? – Xotic750

ответ

0
function string2Bin(s) { 
    var b = new Array(); 
    var last = s.length; 
    for (var i = 0; i < last; i++) { 
    var d = s.charCodeAt(i); 
    if (d < 128) 
     b[i] = dec2Bin(d); 
    else { 
     var c = s.charAt(i); 
     alert(c + ' is NOT an ASCII character'); 
     b[i] = -1; 
    } 
    } 
    return b; 
} 

function dec2Bin(d) { 
    var b = ''; 
    for (var i = 0; i < 8; i++) { 
    b = (d%2) + b; 
    d = Math.floor(d/2); 
    } 
    return b; 
} 
+0

Знаете ли вы, что такое отступы? Пожалуйста, переформатируйте свой код, чтобы он читался. – Bojangles

2

Это даст вам двоичную строку из типизированного массива

var bitsPerByte = 8; 
var array = new Uint8Array([0, 50, 100, 170, 200, 255]); 
var string = ""; 

function repeat(str, num) { 
    if (str.length === 0 || num <= 1) { 
     if (num === 1) { 
      return str; 
     } 

     return ''; 
    } 

    var result = '', 
     pattern = str; 

    while (num > 0) { 
     if (num & 1) { 
      result += pattern; 
     } 

     num >>= 1; 
     pattern += pattern; 
    } 

    return result; 
} 

function lpad(obj, str, num) { 
    return repeat(str, num - obj.length) + obj; 
} 

Array.prototype.forEach.call(array, function (element) { 
    string += lpad(element.toString(2), "0", bitsPerByte); 
}); 

console.log(string); 

Выход

000000000011001001100100101010101100100011111111 

На jsfiddle

Или, возможно, вы спрашиваете об этом?

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

Примечание: что, используя apply таким образом, означает, что вы можете нажать аргумент ограничения (некоторые элементы 16000 или около того), а затем вам придется перебрать элементы массива, вместо этого.

На html5rocks

15

Следующий код будет последовательно преобразовать ArrayBuffer к String и обратно без потери или добавления каких-либо дополнительных байтов.

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)); 
    } 
} 

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; 
} 

Я проверил его кругооборот следующие значения в этом jsfiddle: http://jsfiddle.net/potatosalad/jrdLV/

(String) "abc" -> (ArrayBuffer) -> (String) "abc" 
(String) "aΩc" -> (ArrayBuffer) -> (String) "aΩc" 
(Uint8Array) [0,1,255] -> (ArrayBuffer) -> (String) -> (Uint8Array) [0,1,255] 
(Uint16Array) [0,1,256,65535] -> (ArrayBuffer) -> (String) -> (Uint16Array) [0,1,256,65535] 
(Uint32Array) [0,1,256,65536,4294967295] -> (ArrayBuffer) -> (String) -> (Uint32Array) [0,1,256,65536,4294967295] 
+0

Спасибо. Какую кодировку он возвращает из файлаReader.readAsArrayBuffer и fileReader.readAsBinaryString? – aung