2017-08-01 1 views
0

J'essaie de convertir une chaîne hexadécimale en un nombre flottant en Javascript. Supposons que j'ai la chaîne hex "0082d241". En utilisant this online converter et en sélectionnant Swap endianness, la valeur float correcte est 26,3135.De hex à float - Javascript

Je sais que c'est la bonne réponse car elle provient d'un capteur TMP36.

J'ai essayé d'autres exemples que j'ai trouvés ici sur SO, comme Converting hexadecimal to float in javascript, mais aucun d'eux n'a fonctionné.

Répondre

1

La première étape consiste à permuter l'endianness, en utilisant le code source trouvé sur le page que vous avez montré.

Ensuite, vous pouvez convertir la chaîne hexadécimale en valeur flottante.

function flipHexString(hexValue, hexDigits) { 
 
    var h = hexValue.substr(0, 2); 
 
    for (var i = 0; i < hexDigits; ++i) { 
 
    h += hexValue.substr(2 + (hexDigits - 1 - i) * 2, 2); 
 
    } 
 
    return h; 
 
} 
 

 

 
function hexToFloat(hex) { 
 
    var s = hex >> 31 ? -1 : 1; 
 
    var e = (hex >> 23) & 0xFF; 
 
    return s * (hex & 0x7fffff | 0x800000) * 1.0/Math.pow(2, 23) * Math.pow(2, (e - 127)) 
 
} 
 

 
console.log(hexToFloat(flipHexString("0x0082d241", 8))); 
 
console.log(hexToFloat(flipHexString("0x5d7e2842", 8)));

+0

désolé pour la réponse tardive, mais cela revient toujours la même valeur: quel que soit le 26,3134765625 measurment est. (J'ai changé le "0x0082d241" dans la dernière ligne de votre code " – kots

+0

@kots Il doit y avoir quelque chose de mal dans votre code.J'ai ajouté un extrait de code de travail à ma réponse pour vous montrer les résultats avec deux chaînes hexadécimales – Teh

+0

peut-être parce que je l'utilise avec le nœud rouge? Voici comment je l'utilise: ms = msg.payload.data; fonction flipHexString (hexValue, hexDigits) { var h = hexValue.substr (0, 2); for (var i = 0; i > 31? -1: 1; var e = (hex >> 23) & 0xFF; return s * (hex et 0x7fffff | 0x800000) * 1.0/Math.pow (2, 23) * Math.pow (2, (e - 127)); Msg.payload = hexToFloat (flipHexString (ms, 8)) } return msg; @Teh – kots