在JavaScript中将字节数组转换为字符串

100

如何将字节数组转换为字符串?

我找到了这些函数来进行反向操作:

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

但是我该如何让这些函数双向工作呢?


你想要将字节数组转换为字符串,还是将位数组转换为字符串? - mcandre
请参阅适用于utf8数组的正确解决方案:Javascript中的Uint8Array转换为字符串 - Vadzim
16个回答

1

虽然来晚了,但如果您的输入是ASCII字节形式的,则可以尝试这个解决方案:

function convertArrToString(rArr){
 //Step 1: Convert each element to character
 let tmpArr = new Array();
 rArr.forEach(function(element,index){
    tmpArr.push(String.fromCharCode(element));
});
//Step 2: Return the string by joining the elements
return(tmpArr.join(""));
}

function convertArrToHexNumber(rArr){
  return(parseInt(convertArrToString(rArr),16));
}

0

更新

@rosberg-linhares 目前发布了最佳解决方案来处理UTF8。


没有找到适用于UTF-8字符的解决方案。String.fromCharCode很好,直到你遇到2字节字符。

例如单词Hüser可以以arraybuffer的形式通过网络传输,如[0x48,0xc3,0xbc,0x73,0x65,0x72](例如通过websocket连接)

但是如果你使用String.fromCharCode处理它,你会得到Hüser,因为每个字节都会被单独转换为一个字符,而字母ü由两个字节编码。

解决方案

目前我正在使用以下解决方案:

function pad(n) { return (n.length < 2 ? '0' + n : n); }
function decodeUtf8(data) {
  return decodeURIComponent(
    data.map(byte => ('%' + pad(byte.toString(16)))).join('')
  );
}

你可能将普通的8位字节数组和“UTF-8”字节数组混淆了。如果你想处理UTF-8字节数组,只需使用TextEncoderTextDecoder即可。如果你要处理值从0到255的普通字节数组,可以使用String.fromCharCode()String.charCodeAt() - hldev
@hldev 可能我没有表达清楚。在仍需要支持不支持TextEncoder的浏览器(例如Edge 12-18)的世界中,您必须考虑一些解决方案,以便为客户端提供适用于接收到的8位字节数组的UTF-8编码的解决方案。我提供的解决方案是关于在浏览器中使用不同的解码方法。 感谢您指出我的回答中的一些缺陷 :) - Soul_man

0

我有一些带填充字符和其他我不需要的东西的解密字节数组,所以我做了这个(可能不完美,但对于我的有限使用来说它有效)

var junk = String.fromCharCode.apply(null, res).split('').map(char => char.charCodeAt(0) <= 127 && char.charCodeAt(0) >= 32 ? char : '').join('');

0
> const stringToBin = (str) => [...str].map(item=>item.charCodeAt())
> undefined
> stringToBin('hello')
> (5) [104, 101, 108, 108, 111]
> const binToString = (array) => String.fromCharCode(...array) 
> undefined
> binToString(stringToBin('hello'))
> 'hello'

0

你要找的是String.fromCharCode

你想做的是循环遍历字节数组(以整数表示),创建相应的字符串并将其添加到结果中:

function bin2String(array) {
  var result = "";
  for (const char of array) {
    result += String.fromCharCode(char);
  }
  return result;
}

console.log(bin2String([116, 104, 101, 32, 114, 101, 115, 117, 108, 116]));

你也可以使用 Array.Map 函数将字节数组转换为字符串数组,然后将它们全部连接起来。

function string2Bin(array) {
  return array.map(byte => String.fromCharCode(byte)).join("");
}

console.log(string2Bin([116, 104, 101, 32, 114, 101, 115, 117, 108, 116]));


-3
我找到的最简单的解决方案是:
var text = atob(byteArray);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接