如何在JavaScript中将十六进制转换为ASCII?


78

如何在JavaScript中将Hex字符串转换为字符串ASCII

例如:

32343630将是2460


7
我确定有一个^^的jQuery插件
AndiDog,2010年

2
jQuery主要用于DOM操作,并在较小程度上重新实现诸如Array.prototype.{map,forEach}()过时/受限浏览器之类的功能。老实说,这似乎更像Underscore.js的境界。
Chinoto Vokro'9

1
@AndiDog对使用节点的我们而言无用
Adam F

Answers:


156
function hex2a(hexx) {
    var hex = hexx.toString();//force conversion
    var str = '';
    for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}
hex2a('32343630'); // returns '2460'

2
这是行不通的。console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!
steinybot

3
由于以下原因,此答案是错误的&& hex.substr(i, 2) !== '00'。正如@steinybot注意到的那样,此方法首先中止0,因此不会完全将十六进制转换为字符串。正确的解决方案是: function hex2a(hexx) { var hex = hexx.toString();//force conversion var str = ''; for (var i = 0; i < hex.length; i += 2) str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); return str; }
MarcWäckerlin

编辑历史表明NUL是故意添加的缺陷。该答案已损坏。
Don Cruickshank

36

为了完整起见,反向功能:

function a2hex(str) {
  var arr = [];
  for (var i = 0, l = str.length; i < l; i ++) {
    var hex = Number(str.charCodeAt(i)).toString(16);
    arr.push(hex);
  }
  return arr.join('');
}
a2hex('2460'); //returns 32343630

3
关于此实现的说明:当hex值介于0x0和0x9之间时,必须手动插入“ 0” 。为此,我将您更改arr.push(hex)arr.push(hex.length > 1 && hex || "0" + hex);
2014年

字符串连接速度居然比字符串数组建设和在javascript加盟
麻辣

1
您有错别字,忘了放在右括号后面toString(16)(第4行)。;-)
Arjun 2015年

27

另一种方法(如果使用Node.js):

var input  = '32343630';
var output = new Buffer(input, 'hex');
log(input + " -> " + output);  // Result: 32343630 -> 2460

1
最好的解决方案!使用本机函数。这应该是公认的答案!
Milkncookiez

然后转换output为ASCII,请使用output.toString()
-rmanna,

new Buffer(input,"hex").toString()给出原始字符串
malik bagwala


8

我在web3库中找到了一个有用的功能。

var hexString = "0x1231ac"
string strValue = web3.toAscii(hexString)

4

**十六进制为字符串**

let input  = '32343630';

注意:let output = new Buffer(input,'hex'); //不推荐使用

let buf = Buffer.from(input, "hex");
let data = buf.toString("utf8");

3
我不确定为什么这会被否决,在我看来这是2020
nodejs

@PascalBelloncle我同意这是Node.js的最佳答案,但问题是Buffer常规JavaScript中不存在。我希望这次投票是因为问题是用JavaScript而不是Node.js标记的。
Don Cruickshank

3

我发现如果您必须处理02(STX)或03(ETX)之类的控制字符,上述解决方案将不起作用,其中的任何内容都10将被读取为一个数字,然后丢弃所有内容。我遇到了尝试通过串行通信进行解析的问题。因此,我首先将接收到的十六进制字符串放入缓冲区对象中,然后将十六进制字符串转换为字符串数组,如下所示:

buf = Buffer.from(data, 'hex');
l = Buffer.byteLength(buf,'hex');
for (i=0; i<l; i++){

    char = buf.toString('hex', i, i+1);
    msgArray.push(char);

}

然后加入

message = msgArray.join('');

然后我创建了一个hexToAscii函数,就像上面@Delan Azabani的答案一样...

function hexToAscii(str){
    hexString = str;
    strOut = '';
        for (x = 0; x < hexString.length; x += 2) {
            strOut += String.fromCharCode(parseInt(hexString.substr(x, 2), 16));
        }
    return strOut;    
}

然后hexToAscii在“消息”上调用该函数

message = hexToAscii(message);

这种方法还允许我使用控制字符遍历数组并切成传输的不同部分,这样我就可以只处理想要的部分数据。希望这对别人有帮助!


1

console.log(

"68656c6c6f20776f726c6421".match(/.{1,2}/g).reduce((acc,char)=>acc+String.fromCharCode(parseInt(char, 16)),"")

)


0

@michieljoris提出的反向函数实现的优化版本(根据@Beterraba和@Mala的评论):

function a2hex(str) {
  var hex = '';
  for (var i = 0, l = str.length; i < l; i++) {
    var hexx = Number(str.charCodeAt(i)).toString(16);
    hex += (hexx.length > 1 && hexx || '0' + hexx);
  }
  return hex;
}
alert(a2hex('2460')); // display 32343630

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.