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

Javascript 如何从ArrayBuffer获取二进制字符串?,javascript,arraybuffer,Javascript,Arraybuffer,在JavaScript中,从ArrayBuffer获取二进制字符串的方法是什么 我不想对字节进行编码,只是将二进制表示形式作为字符串 提前谢谢 函数string2Bin(s){ 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)

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

我不想对字节进行编码,只是将二进制表示形式作为字符串

提前谢谢

函数string2Bin(s){
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;
}
var b=新数组(); var last=s.长度; 对于(变量i=0;i
这将从类型化数组中获得一个二进制字符串

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

或者你是在问这个

function ab2str(buf) {
    return String.fromCharCode.apply(null, new Uint16Array(buf));
}
注意:以这种方式使用
apply
意味着您可以达到参数限制(大约16000个元素左右),然后您将不得不通过数组元素进行循环


在上,以下代码将一致地将
ArrayBuffer
转换为
字符串,然后再转换回来,而不会丢失或添加任何额外的字节

函数ArrayBufferToString(缓冲区){
返回BinaryToString(String.fromCharCode.apply(null,Array.prototype.slice.apply(新的Uint8Array(buffer)));
}
函数StringToArrayBuffer(字符串){
返回StringToUint8Array(string).buffer;
}
函数BinaryToString(二进制){
var误差;
试一试{
返回解码组件(转义(二进制));
}捕获(_错误){
错误=_错误;
if(错误实例f URIError){
返回二进制;
}否则{
投掷误差;
}
}
}
函数StringToBinary(字符串){
变量字符,代码,i,isUCS2,len,_i;
len=字符串长度;
字符=[];
isUCS2=false;
对于(i=_i=0;0 len;i=0 255){
isUCS2=true;
chars=null;
打破
}否则{
字符推送(代码);
}
}
如果(isUCS2==true){
返回unescape(encodeURIComponent(string));
}否则{
返回String.fromCharCode.apply(null,Array.prototype.slice.apply(chars));
}
}
函数StringToUint8Array(字符串){
变量二进制,宾伦,缓冲区,字符,i,_i;
二进制=字符串二进制(字符串);
binLen=binary.length;
缓冲区=新阵列缓冲区(binLen);
chars=新的Uint8Array(缓冲区);

对于(i=_i=0;0 binLen;i=0而言,近年来通过添加JavaScript使这一点变得更加简单–下面是一个将Uint8Array转换为二进制编码字符串的单行方法:

const toBinString=(字节)=>
bytes.reduce((str,byte)=>str+byte.toString(2).padStart(8,'0'),“”);
例如:

console.log(toBinString(Uint8Array.from([42100255,0]))
// => '00101010011001001111111100000000'
如果从ArrayBuffer开始,请创建缓冲区的Uint8Array“视图”以传递到此方法:

const view=newuint8array(myArrayBuffer);
console.log(toBinString(view));

资料来源:图书馆()

我不完全理解您实际想要完成的转换,您能进一步解释一下您想要什么吗?谢谢。它从fileReader.readAsArrayBuffer和fileReader.readAsBinaryString返回的是什么编码?@aung
readAsBinaryString
只是一个基于个人转换的0和1的字符串双字节。没有“编码”。
readAsArrayBuffer
使用您告诉它的任何掩码(即Uint8、Uint16、Uint32等)。ArrayBufferToString()似乎无法将ArrayBuffer/Uint8Array正确转换为二进制字符串。使用PNG文件进行测试时,添加了一些字节,但更改了一些字节。但是,大多数字节都是正确的。我是否出错?我使用FileReader.readAsArrayBuffer()读取PNG文件,然后将其发送到ArrayBufferToString()。此处似乎允许对代码所做的操作进行一些解释
function ab2str(buf) {
    return String.fromCharCode.apply(null, new Uint16Array(buf));
}
(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]