¿Cómo convertir de Hex a ASCII en JavaScript?


78

Cómo convertir de Hexcadena aASCII cadena en JavaScript?

Ex:

32343630 será 2460


7
Estoy seguro de que hay un complemento de jQuery para eso ^^
— AndiDog

2
jQuery está diseñado principalmente para la manipulación DOM y, en menor medida, reimplementa cosas como Array.prototype.{map,forEach}()para navegadores obsoletos / limitados. Honestamente, esto parece más el reino de Underscore.js .
— Chinoto Vokro

1
@AndiDog No es útil para aquellos de nosotros que usamos el nodo
— Adam F

Respuestas:


158
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
Esto no funciona. console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!.
— steinybot

3
Esta respuesta es incorrecta debido a: && hex.substr(i, 2) !== '00'. Como notó @steinybot, esto aborta en el primero 0y, por lo tanto, no convierte completamente hexadecimal en cadena. La solución correcta es: 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; }
— Marc Wäckerlin

El historial de edición muestra que el NULdefecto se agregó a propósito. Esta respuesta se ha dañado.
— Don Cruickshank

36

En aras de la integridad, la función inversa:

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
Una nota sobre esta implementación: debe insertar manualmente un "0" cuando el hexvalor esté entre 0x0 y 0x9. Para esto, cambio tu arr.push(hex)a arr.push(hex.length > 1 && hex || "0" + hex);.
— Beterraba

La concatenación de cadenas es en realidad más rápida que la construcción de matrices de cadenas y la unión en javascript
— Mala

1
Tiene un error tipográfico, olvidó poner el paréntesis de cierre después de toString(16)(línea no. 4). ;-)
— Arjun

29

Otra forma de hacerlo (si usa Node.js):

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

1
¡Mejor solución! Usando funciones nativas. ¡Esta debería ser la respuesta aceptada!
— Milkncookiez

para luego convertir outputa ASCII, useoutput.toString()
— rmanna

new Buffer(input,"hex").toString()entrega la cadena original
— malik bagwala

21

Puedes usar esto ...

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


8

Encontré una función útil presente en la biblioteca web3 .

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

4

** para Hexa a Cadena **

let input  = '32343630';

Nota: let output = new Buffer (input, 'hex'); // esto está desaprobado

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

3
No estoy seguro de por qué se votó en contra, me parece que esa es la mejor respuesta ahora para nodejs en 2020
— Pascal Belloncle

@PascalBelloncle Estoy de acuerdo en que esta es la mejor respuesta para Node.js, pero el problema es que Bufferno existe en JavaScript normal. Espero que el voto negativo se deba a que la pregunta está etiquetada con JavaScript y no con Node.js.
— Don Cruickshank

3

Descubrí que la solución anterior no funcionará si tiene que lidiar con caracteres de control como 02(STX) o 03(ETX), todo 10lo que esté debajo se leerá como un solo dígito y eliminará todo lo que sigue. Me encontré con este problema al intentar analizar las comunicaciones en serie. Entonces, primero tomé la cadena hexadecimal recibida y la puse en un objeto de búfer, luego convertí la cadena hexadecimal en una matriz de cadenas de la siguiente manera:

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

}

Entonces. Únete

message = msgArray.join('');

luego creé una hexToAsciifunción como en la respuesta de @Delan Azabani anterior ...

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

luego llamó a la hexToAsciifunción en 'mensaje'

message = hexToAscii(message);

Este enfoque también me permitió iterar a través de la matriz y dividir las diferentes partes de la transmisión utilizando los caracteres de control para luego poder tratar solo con la parte de los datos que quería. ¡Espero que esto ayude a alguien más!


1

console.log(

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

)


0

Una versión optimizada de la implementación de la función inversa propuesta por @michieljoris (según los comentarios de @Beterraba y @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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.