由于JavaScript只有num类型,所以进制转换中单精度和双精度浮点数没法直接转换,下面是根据公式计算的,原理网上有。背景是我通过udp接收终端远程传输的modbus的数据,解析出来的十六进制数据需转换成单精度和双精度浮点数。
var string = [‘4’,’0’,’7’,’e’,’e’,’6’,’a’,’1’,’5’,’7’,’6’,’c’,’0’,’0’,’0’,’0’];
//先转换成二进制字符串
var num;
function changeToHex(n){
num = parseInt(n,16).toString(2);
num = (‘000’+num).slice(-4);
return num;
console.log(num);
}
function changeToNum(pendingString){
var douString = ”;
for (var i = 0; i < string.length; i++) {
changeToHex(string[i]);
douString = douString + num;
}
console.log(douString);
//阶码,尾数
var orderCode = douString.substring(1,12);
var tailNumber = ‘1’ + douString.substring(12);
console.log(orderCode);
console.log(tailNumber);
//指数=解码-1023,即为偏移位数
var index = parseInt(orderCode,2) - 1023;
//整数部分二进制integerDou 小数二进制 decimalDou
console.log(typeof tailNumber);
var integerDou = tailNumber.substring(0,index+1);
var decimalDou = tailNumber.substring(index+1);
console.log(integerDou);
console.log(decimalDou);
//根据公式分别转换成小数和实数部分,相加都totalNum
var integerNum = 0;
var decimalNum = 0;
var totalNum = 0;
for (var i = 0; i < integerDou.length; i++) {
integerNum = integerNum + integerDou[i]*Math.pow(2,index - i);
}
console.log(integerNum);
for (var i = 0; i < decimalDou.length; i++) {
decimalNum = decimalNum + decimalDou[i]*Math.pow(2,-1 - i);
}
console.log(decimalNum);
totalNum = integerNum + decimalNum;
console.log(totalNum);
}
changeToNum(string);