2010-09-19 11 views
53

Comment faire pour convertir à partir de Hex chaîne en ASCII chaîne en JavaScript?Comment convertir en hexadécimal ASCII en JavaScript?

Ex:

32343630 il sera 2460

+6

Je suis sûr qu'il ya un plugin jQuery pour que ^^ – AndiDog

+2

jQuery est principalement destiné à la manipulation du DOM et dans une moindre mesure, des choses comme réimplémentant 'Array.prototype. {Carte, forEach}()' pour jour/navigateurs limités. Honnêtement, cela ressemble plus au domaine de [Underscore.js] (http://underscorejs.org/). –

+0

@AndiDog Pas utile pour ceux d'entre nous qui utilisent le noeud –

Répondre

114
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' 
32

Pour être complet la fonction inverse:

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 
+2

Une note sur cette implémentation: vous devez insérer manuellement un "0" lorsque la valeur de 'hex' est comprise entre 0x0 et 0x9. Pour cela, je change votre 'arr.push (hex)' en 'arr.push (hex.length> 1 && hex ||" 0 "+ hex);'. – Beterraba

+0

La concaténation de chaîne est en fait plus rapide que la construction d'une chaîne de caractères et la javascript – Mala

+0

Vous avez une faute de frappe, vous avez oublié de mettre la parenthèse fermante après 'toString (16)' (ligne n ° 4). ;-) – Arjun

10

Vous pouvez utiliser ..

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

7

Une autre façon de le faire (si vous utilisez Node.js):

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

J'ai trouvé que la solution ci-dessus ne fonctionnera pas si vous avez à traiter avec des caractères de contrôle comme 02 (STX) ou 03 (ETX), tout élément de moins de 10 sera lu comme un seul chiffre et rejettera tout après. J'ai rencontré ce problème en essayant d'analyser les communications série. Donc, j'ai d'abord pris la chaîne hexagonale reçu et le mettre dans un objet tampon converti puis la chaîne hexagonale dans un tableau des chaînes comme si

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

Puis .join il

message = msgArray.join('');

alors je créé une fonction hexToAscii comme dans @Del une réponse de Azabani ci-dessus ...

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

appelait alors la fonction hexToAscii sur 'message'

message = hexToAscii(message);

Cette approche m'a aussi permis de parcourir le tableau et découper dans les différentes parties de la transmission en utilisant les caractères de contrôle afin que je puisse alors traiter seulement la partie des données que je voulais. J'espère que cela aide quelqu'un d'autre!

1

J'ai trouvé une fonction utile présente dans la bibliothèque web3.

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