2013-05-03 34 views
11

Cách để lấy chuỗi nhị phân từ ArrayBuffer trong JavaScript là gì?Làm cách nào để nhận chuỗi nhị phân từ ArrayBuffer?

Tôi không muốn mã hóa các byte, chỉ nhận được biểu diễn nhị phân dưới dạng Chuỗi.

Cảm ơn trước!

+0

tôi không hoàn toàn hiểu những gì chuyển đổi bạn đang thực sự cố gắng để hoàn thành, bạn có thể đưa ra một số giải thích thêm để làm rõ những gì bạn muốn? – Xotic750

Trả lời

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

Bạn có biết thụt lề là gì không? Vui lòng định dạng lại mã của bạn để mã có thể đọc được – Bojangles

2

này sẽ cung cấp cho bạn một chuỗi nhị phân từ một mảng gõ

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

Output là

000000000011001001100100101010101100100011111111 

On jsfiddle

Hoặc có lẽ bạn đang hỏi về điều này?

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

Lưu ý: rằng việc sử dụng apply theo cách này có nghĩa là bạn có thể nhấn hạn chế tranh luận (một số 16000 yếu tố hoặc lâu hơn), và sau đó bạn sẽ phải lặp qua các phần tử mảng để thay thế.

On html5rocks

15

Các mã sau sẽ liên tục chuyển đổi một ArrayBuffer đến một String và ngược lại mà không làm mất hoặc thêm bất kỳ byte bổ sung.

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

Tôi đã thử nghiệm nó bằng cách quay vòng các giá trị sau trong jsfiddle này: 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

Cảm ơn bạn. Những gì mã hóa nó trở về từ fileReader.readAsArrayBuffer và fileReader.readAsBinaryString? – aung

Các vấn đề liên quan