Wie konvertiere ich von Hex nach ASCII in JavaScript?

78

Wie konvertiere ich in JavaScript von HexString zu ASCIIString?

Ex:

32343630 wird es 2460 sein

Q8Y
quelle
7
Ich bin sicher, es gibt ein jQuery-Plugin dafür ^^
AndiDog
2
jQuery ist in erster Linie für die DOM-Manipulation und in geringerem Maße für die Neuimplementierung von Dingen wie Array.prototype.{map,forEach}()für veraltete / eingeschränkte Browser gedacht . Ehrlich gesagt scheint dies eher das Reich von Underscore.js zu sein .
Chinoto Vokro
1
@AndiDog Nicht nützlich für diejenigen von uns, die Knoten verwenden
Adam F

Antworten:

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'
Delan Azabani
quelle
2
Das funktioniert nicht. console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!.
Steinybot
3
Diese Antwort ist falsch aus : && hex.substr(i, 2) !== '00'. Wie @steinybot bemerkt hat, bricht dies beim ersten Mal ab 0und konvertiert daher Hex nicht vollständig in String. Die richtige Lösung ist: 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
Der Bearbeitungsverlauf zeigt, dass der NULFehler absichtlich hinzugefügt wurde. Diese Antwort wurde beschädigt.
Don Cruickshank
36

Der Vollständigkeit halber die umgekehrte Funktion:

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
quelle
3
Ein Hinweis zu dieser Implementierung: Sie müssen manuell eine "0" einfügen, wenn der hexWert zwischen 0x0 und 0x9 liegt. Dafür ändere ich deine arr.push(hex)zu arr.push(hex.length > 1 && hex || "0" + hex);.
Beterraba
Die Verkettung von Zeichenfolgen ist tatsächlich schneller als die Erstellung von Zeichenfolgenarrays und das Zusammenfügen von Javascript
Mala,
1
Sie haben einen Tippfehler, Sie haben vergessen, die schließende Klammer nach toString(16)(Zeile Nr. 4) zu setzen. ;-)
Arjun
27

Eine andere Möglichkeit (wenn Sie Node.js verwenden):

var input  = '32343630';
var output = new Buffer(input, 'hex');
log(input + " -> " + output);  // Result: 32343630 -> 2460
0x8BADF00D
quelle
1
Beste Lösung! Native Funktionen verwenden. Dies sollte die akzeptierte Antwort sein!
Milkncookiez
outputoutput.toString()
Um
new Buffer(input,"hex").toString()gibt die ursprüngliche Saite aus
Malik Bagwala
21

Sie können dies verwenden ..

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

Sampath Liyanage
quelle
8

Ich habe eine nützliche Funktion in der web3- Bibliothek gefunden.

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

** für Hexa zu String **

let input  = '32343630';

Hinweis: let output = new Buffer (Eingabe, 'hex'); // das ist veraltet

let buf = Buffer.from(input, "hex");
let data = buf.toString("utf8");
Mathad
quelle
3
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Dies scheint mir die beste Antwort für NodeJs im Jahr 2020 zu sein
Pascal Belloncle
@PascalBelloncle Ich stimme zu, dass dies die beste Antwort für Node.js ist, aber das Problem ist, dass Bufferes in normalem JavaScript nicht existiert. Ich gehe davon aus, dass die Ablehnung darauf zurückzuführen ist, dass die Frage mit JavaScript und nicht mit Node.js versehen ist.
Don Cruickshank
3

Ich habe festgestellt, dass die obige Lösung nicht funktioniert, wenn Sie sich mit Steuerzeichen wie 02(STX) oder 03(ETX) befassen müssen. Alles darunter 10wird als einzelne Ziffer gelesen und wirft danach alles weg. Ich bin auf dieses Problem gestoßen, als ich versucht habe, die serielle Kommunikation zu analysieren. Also habe ich zuerst die empfangene Hex-Zeichenfolge genommen und in ein Pufferobjekt eingefügt und dann die Hex-Zeichenfolge in ein Array der folgenden Zeichenfolgen konvertiert:

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

}

Dann mach mit

message = msgArray.join('');

dann habe ich eine hexToAsciiFunktion erstellt, genau wie in der obigen Antwort von @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;    
}

rief dann die hexToAsciiFunktion auf 'Nachricht' auf

message = hexToAscii(message);

Dieser Ansatz ermöglichte es mir auch, das Array zu durchlaufen und mithilfe der Steuerzeichen in die verschiedenen Teile der Übertragung zu schneiden, sodass ich dann nur den Teil der Daten verarbeiten konnte, den ich wollte. Hoffe das hilft jemand anderem!

myfavoritenoisemaker
quelle
1

console.log(

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

)

Zibri
quelle
0

Eine optimierte Version der von @michieljoris vorgeschlagenen Implementierung der Umkehrfunktion (gemäß den Kommentaren von @Beterraba und @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
quelle