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

IT技术 javascript casting
2021-01-22 02:25:00

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

我发现这些功能相反:

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

但是我如何让函数以另一种方式工作?

谢谢。

6个回答

您需要将每个八位字节解析回数字,并使用该值来获取一个字符,如下所示:

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

编辑:是的,你的当前string2Bin可以写得更短:

function string2Bin(str) {
  var result = [];
  for (var i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i).toString(2));
  }
  return result;
}

但是通过查看您链接的文档,我认为该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
感谢您的超快速响应。几个问题... 1) 您的 bin2String 函数令人印象深刻 - 只有 5 行代码。能否修改string2bin 函数,使用更多的Javascript 函数来缩短函数和子函数?.....
2021-03-14 02:25:00
多字节 utf-8 字符失败,即: bin2String([0xE2, 0x98, 0xB9])
2021-03-16 02:25:00
String.fromCharCode.apply(String, array)对于 Safari 中很长的字符串是不安全的。JavaScriptCore 中存在一个问题,这意味着函数不能接受超过 65536 个参数,否则将抛出 RangeError。它还会将浏览器锁定在比它稍小的数组上。参见bugs.webkit.org/show_bug.cgi?id=80797
2021-03-19 02:25:00
2)我需要这些转换的原因是因为我正在捕获一个签名,我必须将其转换为填充数据库中的 BLOB 字段。问题是,虽然这 2 个函数可以工作,但其他地方出了问题。最重要的是,当我从数据库中检索 BLOB 时,它会进入一个字节数组对象。但是,当我在通过原始函数运行后将 BLOB 写入数据库时​​,它不是字节数组对象。这可能是导致问题的原因。有任何想法吗?
2021-03-29 02:25:00
dcx.sybase.com/index.html#1101en/ulmbus_en11/... 这是我用来设置数据的语法。
2021-03-31 02:25:00

ES6 更新

现在,字符串 'foo' 也等于 String.fromCharCode(...[102, 111, 111])

原答案

只需apply将您的字节数组转换为String.fromCharCode. 例如

String.fromCharCode.apply(null, [102, 111, 111]) 等于'foo'。

MDN 文档在这里

警告:适用于短于 65535 的数组 - MDN docs here

6 年前接受的答案已经证明了这一点。
2021-03-14 02:25:00
啊,确实,我错过了那条线。基本上我正在寻找一个简短的单线,我驳回了那个冗长且经过编辑的答案(可能太仓促了)。
2021-03-17 02:25:00
即使重新迭代,它的简洁性也使它比公认的答案更好。
2021-04-08 02:25:00

尝试新的文本编码 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);

不幸的是 IE 不支持它。
2021-03-26 02:25:00
如果你需要 UTF-8 和 IE 支持,你可以使用MDN 网站推荐FastestSmallestTextEncoderDecoder polyfill
2021-04-05 02:25:00

这应该有效:

String.fromCharCode(...array);

或者

String.fromCodePoint(...array)
简短而甜蜜;)
2021-03-19 02:25:00

string2Bin 可以写得简洁,没有任何循环,启动!

function string2Bin ( str ) {
    return str.split("").map( function( val ) { 
        return val.charCodeAt( 0 ); 
    } );
}
很想知道添加的函数调用是否会减慢速度。
2021-03-23 02:25:00
它仍然有一个循环,它只是隐藏在 map() 中。
2021-04-09 02:25:00