如何从ArrayBuffer获取二进制字符串?

Ore*_*est 14 javascript arraybuffer

在JavaScript中从ArrayBuffer获取二进制字符串的方法是什么?

我不想编码字节,只是将二进制表示形式为String.

提前致谢!

pot*_*lad 16

以下代码将始终将ArrayBuffera 转换为a 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;
}
Run Code Online (Sandbox Code Playgroud)

我通过在这个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]
Run Code Online (Sandbox Code Playgroud)


Jas*_*ner 14

近年来,通过在 JavaScript 中添加\xe2\x80\x93\xc2\xa0here\'s 一种将 Uint8Array 转换为二进制编码字符串的单行方法,使这一过程变得更加简单:

\n
const toBinString = (bytes) =>\n  bytes.reduce((str, byte) => str + byte.toString(2).padStart(8, \'0\'), \'\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

例子:

\n
console.log(toBinString(Uint8Array.from([42, 100, 255, 0])))\n// => \'00101010011001001111111100000000\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您从 ArrayBuffer 开始,请创建缓冲区的 Uint8Array“视图”以传递到此方法:

\n
const view = new Uint8Array(myArrayBuffer);\nconsole.log(toBinString(view));\n
Run Code Online (Sandbox Code Playgroud)\n\n

来源:Libauth库(binToBinString 方法

\n


M S*_*ach -1

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;
}
Run Code Online (Sandbox Code Playgroud)