private bytesToFloat(data: number[]): number {
let num: number = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
const s = num & 0x80000000; // Sign(1bit):表示浮点数是正数还是负数。0表示正数,1表示负数
const e: number = ((num >> 23) & 0x0FF) - 127; // Exponent(8bits):指数部分。类似于科学技术法中的M*10^N中的N,只不过这里是以2为底数而不是10。
// 需要注意的是,这部分中是以2^7-1即127,也即01111111代表2^0,转换时需要根据127作偏移调整。
const m = num & 0x007FFFFF; // Mantissa(23bits):基数部分。浮点数具体数值的实际表示。
// 还原float
let ee: number = 0;
let floatVal: number = 0;
if (e == 0) { // 不需要移位
let val: number = 0.5;
for (let i = e + 1; i < 23; i++) {
if (0x01 & (m >> (23 - i))) {
val += this.getDiv(i - e);
} else {
val -= this.getDiv(i);
}
}
floatVal = val;
} else if (e > 0) { // 左移位
// 计算整数部分值
const rightCnt = 23 - e;
ee = 1 << e | m >> rightCnt;
// 计算后23位中小数部分值
let val: number = 0.5;
for (let i = e + 1; i < 23; i++) {
if (0x01 & (m >> (23 - i))) {
val += this.getDiv(i - e);
} else {
val -= this.getDiv(i);
}
}
// todo 暂时不加小数点后面值
floatVal = ee;
// floatVal = ee+val;
} else { // 右移位
ee = 1 >> (-1 * e);
// todo 负数暂时用不到 不实现
}
if (s == 0) {
return floatVal;
} else {
return -1 * floatVal;
}
}
private getDiv(cnt: number) {
let val = 1;
for (let i = 0; i < cnt; i++) {
val = 2 * val;
}
return 0.5 / val;
}