VB IEEE754换算方法
Private Function Str2Float(str As String) As Double
Dim k As Integer
Dim i As Integer
Dim j As Integer
Dim s As Integer
Dim SS As Integer
Dim E As Integer
Dim M As Long
Dim d As Double
Dim n As Integer
Dim h As Integer
Dim l As Integer
Dim s2() As String, st As String
s2 = Split(str, " ")
If UBound(s2) <> 3 Then
MsgBox "数据格式错误,无法转换!"
Str2Float = 0
Exit Function
End If
For i = 0 To UBound(s2)
If Len(s2(i)) = 1 Then s2(i) = "0" & s2(i)
st = st & s2(i)
Next i
Dim buff(7) As Byte
For i = 0 To 7
buff(i) = Asc(Mid(st, i + 1, 1))
Next i
Dim a(15) As Byte
For i = 0 To 15
a(i) = i
Next i
Dim b(7) As Byte
For j = 0 To 7
If buff(j) >= 48 And buff(j) <= 57 Then
k = buff(j) - 48
b(j) = a(k)
ElseIf buff(j) >= 65 And buff(j) <= 70 Then
k = buff(j) - 65
b(j) = a(k + 10)
Else
Exit Function
End If
Next j
Dim c(3) As Long
For n = 0 To 6 Step 2
c(n / 2) = ((b(n) And &H7F) * (2 ^ 4)) Or (b(n + 1) And &H7F)
Next n
s = c(0) / 2 ^ 7
If s = 1 Then
SS = -1
Else
SS = 1
End If
E = ((c(0) And &H7F) * 2) Or ((c(1) And &H80) / 2 ^ 7)
M = ((c(1) And &HFFFFFF) * 2 ^ 16 And &H7FFFFF) Or ((c(2) And &HFFFFFF) * 2 ^ 8) Or ((c(3) And &HFFFFFF))
d = SS * 2 ^ (E - 127) * (M / (2 ^ 23) + 1)
Str2Float = d
End Function
Private Sub Command1_Click()
Debug.Print Str2Float("A D7 A3 3C")
End Sub
C# IEEE754 换算方法
string strbase16 = strhex;
string strtemp = "";
double temp = 0;
int m_s = 0; // 数符
int m_e = 0; // 阶
double m_x = 0; // 小数部分
double m_re = 0; // 计算结果
strtemp = strbase16.Substring(0, 2);
temp = Convert.ToInt32(strtemp, 16) & 0x80;
if (temp == 128) m_s = 1;
strtemp = strbase16.Substring(0, 3);
temp = Convert.ToInt32(strtemp, 16) & 0x7f8;
m_e = Convert.ToInt32(temp / Math.Pow(2, 3));
strtemp = strbase16.Substring(2, 6);
temp = Convert.ToInt32(strtemp, 16) & 0x7fffff;
m_x = temp / Math.Pow(2, 23);
m_re = Math.Pow(-1, m_s) * (1 + m_x) * Math.Pow(2, m_e - 127);
return decimal.Round(Convert.ToDecimal(m_re), 5).ToString();
}
}
}