Javascript 在javascript中将字节数组转换为字符串
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3195865/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Converting byte array to string in javascript
提问by user385579
How do I convert a byte array into a string?
如何将字节数组转换为字符串?
I have found these functions that do the reverse:
我发现这些功能相反:
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;
}
But how do I get the functions working the other way?
但是我如何让函数以另一种方式工作呢?
Thanks.
谢谢。
Shao
邵
回答by CMS
You need to parse each octet back to number, and use that value to get a character, something like this:
您需要将每个八位字节解析回数字,并使用该值来获取一个字符,如下所示:
function bin2String(array) {
var result = "";
for (var i = 0; i < array.length; i++) {
result += String.fromCharCode(parseInt(array[i], 2));
}
return result;
}
bin2String(["01100110", "01101111", "01101111"]); // "foo"
// Using your string2Bin function to test:
bin2String(string2Bin("hello world")) === "hello world";
Edit:Yes, your current string2Bincan be written more shortly:
编辑:是的,你的当前string2Bin可以写得更短:
function string2Bin(str) {
var result = [];
for (var i = 0; i < str.length; i++) {
result.push(str.charCodeAt(i).toString(2));
}
return result;
}
But by looking at the documentation you linked, I think that the setBytesParametermethod expects that the blob array contains the decimal numbers, not a bit string, so you could write something like this:
但是通过查看您链接的文档,我认为该setBytesParameter方法期望 blob 数组包含十进制数字,而不是位 string,因此您可以编写如下内容:
function string2Bin(str) {
var result = [];
for (var i = 0; i < str.length; i++) {
result.push(str.charCodeAt(i));
}
return result;
}
function bin2String(array) {
return String.fromCharCode.apply(String, array);
}
string2Bin('foo'); // [102, 111, 111]
bin2String(string2Bin('foo')) === 'foo'; // true
回答by Bogdan D
Simply applyyour byte array to String.fromCharCode. For example
只需apply将您的字节数组转换为String.fromCharCode. 例如
String.fromCharCode.apply(null, [102, 111, 111])equals 'foo'.
String.fromCharCode.apply(null, [102, 111, 111])等于'foo'。
Caveat: works for arrays shorter than 65535. MDN docs here.
警告:适用于短于 65535 的数组。MDN 文档在这里。
回答by James
Try the new Text Encoding API:
尝试新的文本编码 API:
// create an array view of some valid bytes
let bytesView = new Uint8Array([104, 101, 108, 108, 111]);
console.log(bytesView);
// convert bytes to string
// encoding can be specfied, defaults to utf-8 which is ascii.
let str = new TextDecoder().decode(bytesView);
console.log(str);
// convert string to bytes
// encoding can be specfied, defaults to utf-8 which is ascii.
let bytes2 = new TextEncoder().encode(str);
// look, they're the same!
console.log(bytes2);
console.log(bytesView);
回答by cmcnulty
That string2Bin can be written even moresuccinctly, and without any loops, to boot!
string2Bin 可以写得更简洁,没有任何循环,启动!
function string2Bin ( str ) {
return str.split("").map( function( val ) {
return val.charCodeAt( 0 );
} );
}
回答by Rouli Freman
This should work:
这应该有效:
String.fromCharCode(...array);
Or
或者
String.fromCodePoint(...array)
回答by lovasoa
I think this would be more efficient:
我认为这会更有效率:
function toBinString (arr) {
var uarr = new Uint8Array(arr.map(function(x){return parseInt(x,2)}));
var strings = [], chunksize = 0xffff;
// There is a maximum stack size. We cannot call String.fromCharCode with as many arguments as we want
for (var i=0; i*chunksize < uarr.length; i++){
strings.push(String.fromCharCode.apply(null, uarr.subarray(i*chunksize, (i+1)*chunksize)));
}
return strings.join('');
}
回答by Balthazar
Even if I'm a bit late, I thought it would be interesting for future users to share some one-liners implementations I did using ES6.
即使我有点晚了,我认为未来的用户分享一些我使用 ES6 完成的单行实现会很有趣。
One thing that I consider important depending on your environment or/and what you will do with with the data is to preserve the full byte value. For example, (5).toString(2)will give you 101, but the complete binary conversion is in reality 00000101, and that's why you might need to create a leftPadimplementation to fill the string byte with leading zeros. But you may not need it at all, like other answers demonstrated.
根据您的环境或/以及您将如何处理数据,我认为重要的一件事是保留完整的字节值。例如,(5).toString(2)会给你101,但完整的二进制转换实际上是00000101,这就是为什么你可能需要创建一个leftPad实现来用前导零填充字符串字节。但是您可能根本不需要它,就像其他答案所展示的那样。
If you run the below code snippet, you'll see the first output being the conversion of the abcstring to a byte array and right after that the re-transformation of said array to it's corresponding string.
如果您运行以下代码片段,您将看到第一个输出是将abc字符串转换为字节数组,然后将所述数组重新转换为相应的字符串。
// For each byte in our array, retrieve the char code value of the binary value
const binArrayToString = array => array.map(byte => String.fromCharCode(parseInt(byte, 2))).join('')
// Basic left pad implementation to ensure string is on 8 bits
const leftPad = str => str.length < 8 ? (Array(8).join('0') + str).slice(-8) : str
// For each char of the string, get the int code and convert it to binary. Ensure 8 bits.
const stringToBinArray = str => str.split('').map(c => leftPad(c.charCodeAt().toString(2)))
const array = stringToBinArray('abc')
console.log(array)
console.log(binArrayToString(array))
回答by ZaksBack
String to byte array:"FooBar".split('').map(c => c.charCodeAt(0));
字符串到字节数组:"FooBar".split('').map(c => c.charCodeAt(0));
Byte array to string:[102, 111, 111, 98, 97, 114].map(c => String.fromCharCode(c)).join('');
字节数组到字符串:[102, 111, 111, 98, 97, 114].map(c => String.fromCharCode(c)).join('');
回答by IgnusFast
I had some decrypted byte arrays with padding characters and other stuff I didn't need, so I did this (probably not perfect, but it works for my limited use)
我有一些带有填充字符和其他不需要的东西的解密字节数组,所以我这样做了(可能并不完美,但它适用于我的有限用途)
var junk = String.fromCharCode.apply(null, res).split('').map(char => char.charCodeAt(0) <= 127 && char.charCodeAt(0) >= 32 ? char : '').join('');
回答by indiaaditya
Too late to answer but if your input is in form of ASCII bytes, then you could try this solution:
回答太晚了,但如果您的输入是 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));
}

