VB中关于将4个字节的16进制转成10进制实数的方法~~急

现在有42480000H这个四个字节的16进制数,其中31位表示符号,23至30位表示阶,0到22位表示尾数.而十进制数的数值=((-1)的'符号'次幂)乘(2的(阶-127)次幂)乘1.(尾数),结果应该等于50.那遍程如何来做呢,有现成的转换程序模块嘛?如果没有,那就要根据原理来算,就要牵涉到位的左移,那又有什么方法可以来实现呢?谢谢高手们指点下.拜托了

第1个回答  2008-04-29
Option Explicit
Dim hexData As String
Dim i As Single
Dim BinData As String
Dim zs As String * 8
Dim zssz As String
Dim xs As String * 23
Dim xs_js(23) As Double
Dim xs_hj As Double
Dim sinData As Single
Dim sHex As String
Dim sBin As String
Dim fh As String * 1
Dim single_Data As Double
Const s1 = "0000101001101111000", s2 = "0125A4936DB7FEC8"

Private Sub Command2_Click()
sHex = Text1
HexToBin (sHex)
fh = Mid(BinData, 1, 1) '取符号
zs = Mid(BinData, 2, 8) '取指数
xs = Mid(BinData, 10, 23) '取2进制小数
xsjs '返回10进制浮点小数部分
sBin = Mid(zs, 1, 8)
BinToHex (sBin)
over1
Text2 = single_Data '
End Sub
Public Function HexToBin(ByVal sHex As String) As String
Dim i As Integer, sBin As String
sHex = UCase(sHex)
For i = 1 To Len(sHex)
sBin = sBin & Mid(s1, InStr(1, s2, Mid(sHex, i, 1)), 4)
Next i
HexToBin = sBin
BinData = sBin
End Function

Private Sub Form_Load()
Text1 = "42480000"
End Sub

Public Function xsjs()
xs_hj = 1
For i = 1 To 23
xs_js(i) = Mid(xs, i, 1)
xs_hj = xs_hj + Val(xs_js(i)) / (2 ^ (1 * i))
Next
End Function

Private Function over1()
If fh = 0 Then
single_Data = 2 ^ (Val("&H" & zssz) - 127) * xs_hj
ElseIf fh = 1 Then
single_Data = -2 ^ (Val("&H" & zssz) - 127) * xs_hj
End If
End Function
'2-16转换
Public Function BinToHex(ByVal sBin As String) As String
Dim i As Integer, sHex As String
sBin = String(3 - (Len(sBin) - 1) Mod 4, "0") & sBin
For i = 1 To Len(sBin) Step 4
sHex = sHex & Mid(s2, InStr(1, s1, Mid(sBin, i, 4)), 1)
Next i
BinToHex = sHex
zssz = sHex
End Function
第2个回答  2008-04-29
这里有一个我写的关于进制转换的函数:

Private Function BHS(IStr As String, YType As Integer, MType As Integer) As String
Dim n As Integer
Dim DNum As Integer

BHS = ""
Select Case YType
Case 16
DNum = Val("&H" & IStr)
Case 10
DNum = Val(IStr)
Case Else
For n = 1 To Len(IStr)
DNum = DNum + ((YType ^ (n - 1)) * Val(Mid(IStr, Len(IStr) - n + 1, 1)))
Next n
End Select
If mtype = 10 Then BHS = CStr(DNum): Exit Function
1:
Select Case DNum Mod MType
Case 15
BHS = "F" & BHS
Case 14
BHS = "E" & BHS
Case 13
BHS = "D" & BHS
Case 12
BHS = "C" & BHS
Case 11
BHS = "B" & BHS
Case 10
BHS = "A" & BHS
Case Else
BHS = CStr(DNum Mod MType) & BHS
End Select

If DNum / MType >= 1 Then
DNum = DNum \ MType
GoTo 1
End If
End Function

用法如下:
BHS As String返回值,转换结果的字符串
IStr As String要转换的数值的字符形式
YType As Integer源字符的进制
MType As Integer要转换的进制

例如:把十六进制数&HFF 转换成十进制数 BHS("FF", 16, 10)
例如:把十进制数255 转换成八进制数 BHS("255", 10, 8)
例如:把二进制数1111 转换成十六进制数 BHS("1111", 2, 16)
第3个回答  2008-04-29
用Api函数CopyMemory

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Form_Load()
Dim bytes(3) As Byte
bytes(2) = &H48
bytes(3) = &H42
Dim dblval As Single
CopyMemory ByVal VarPtr(dblval), ByVal VarPtr(bytes(0)), 4
MsgBox dblval
End Sub本回答被提问者采纳
相似回答