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

78

Cómo convertir de Hexcadena aASCII cadena en JavaScript?

Ex:

32343630 será 2460

Q8Y
fuente
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'
Delan Azabani
fuente
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
michieljoris
fuente
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
0x8BADF00D
fuente
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);

Sampath Liyanage
fuente
8

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

var hexString = "0x1231ac"
string strValue = web3.toAscii(hexString)
Ayushya
fuente
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");
mathad
fuente
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!

myfavoritenoisemaker
fuente
1

console.log(

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

)

Zibri
fuente
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

SimonC
fuente