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!
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!
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;
}
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
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
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]
Cảm ơn bạn. Những gì mã hóa nó trở về từ fileReader.readAsArrayBuffer và fileReader.readAsBinaryString? – aung
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