【问题标题】:How to convert from Hex to ASCII in JavaScript?如何在 JavaScript 中将十六进制转换为 ASCII?
【发布时间】:2010-09-19 12:30:05
【问题描述】:

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

例如:

32343630 将是 2460

【问题讨论】:

  • 我确定有一个 jQuery 插件 ^^
  • jQuery 主要用于 DOM 操作,并在较小程度上为过时/受限的浏览器重新实现诸如 Array.prototype.{map,forEach}() 之类的东西。老实说,这看起来更像Underscore.js's 领域。
  • @AndiDog 对我们这些使用节点的人来说没用

标签: javascript


【解决方案1】:
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;
}
hex2a('32343630'); // returns '2460'

【讨论】:

  • 这不起作用。 console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!.
  • 这个答案是错误的,因为:&amp;&amp; hex.substr(i, 2) !== '00'。正如@steinybot 所注意到的,这在第一个0 上中止,因此不会将十六进制完全转换为字符串。正确的解决方案是:function hex2a(hexx) { var hex = hexx.toString();//force conversion var str = ''; for (var i = 0; i &lt; hex.length; i += 2) str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); return str; }
  • edit history 表明NUL 缺陷是故意添加的。此答案已损坏。
【解决方案2】:

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

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

【讨论】:

  • 最佳解决方案!使用本机函数。这应该是公认的答案!
  • 然后将output转换为ASCII,使用output.toString()
  • new Buffer(input,"hex").toString() 给出原字符串
【解决方案3】:

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

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

【讨论】:

  • 关于此实现的注意事项:当hex 值介于 0x0 和 0x9 之间时,您必须手动插入“0”。为此,我将您的 arr.push(hex) 更改为 arr.push(hex.length &gt; 1 &amp;&amp; hex || "0" + hex);
  • 字符串连接实际上比字符串数组构造和加入javascript更快
  • 你打错了,你忘了把右括号放在toString(16)之后(第4行)。 ;-)
【解决方案4】:

你可以用这个..

var asciiVal = "32343630".match(/.{1,2}/g).map(function(v){
      return String.fromCharCode(parseInt(v, 16));
    }).join('');
    
document.write(asciiVal);

【讨论】:

    【解决方案5】:

    我在web3 库中发现了一个有用的函数。

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

    更新:较新版本的web3在utils中有这个功能

    函数现在驻留在 utils 中:

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

    【讨论】:

    【解决方案6】:

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

    let input  = '32343630';
    

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

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

    【讨论】:

    • 不知道为什么这被否决了,在我看来这是 2020 年 nodejs 的最佳答案
    • @PascalBelloncle 我同意这是 Node.js 的最佳答案,但问题是常规 JavaScript 中不存在 Buffer。我预计投反对票是因为问题被标记为 JavaScript 而不是 Node.js。
    • 你的意思是它在常规JS中不存在@DonCruickshank
    • @DanielTkach 我所说的常规 JavaScript 是指普通浏览器。 Buffer.from("414243", "hex") 适用于 Node.js,但在 Edge 和 Firefox 上失败,因为 Buffer 未定义。
    【解决方案7】:

    我发现如果您必须处理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);
    

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

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          • 2012-12-10
          • 2017-11-18
          • 1970-01-01
          • 2014-11-16
          • 1970-01-01
          相关资源
          最近更新 更多