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