Private Sub Command1_Click() MsgBox HexToNumber("fffffffff")End SubPublic Function HexToNumber(ByVal strHex As String) As Currency Dim i As Long For i = 1 To Len(strHex) HexToNumber = HexToNumber + Val("&H" & Mid(strHex, i, 1)) * (16 ^ (i - 1)) Next End Function
Private Sub Command1_Click() MsgBox HexToNumber("a143") End SubPublic Function HexToNumber(ByVal strHex As String) As Currency Dim i As Long For i = 1 To Len(strHex) HexToNumber = HexToNumber + Val("&H" & Mid(strHex, i, 1)) * (16 ^ (Len(strHex) - i)) Next End Function
iif(&HFFFFFFFF<0,16^8+&HFFFFFFFF,&HFFFFFFFF)
Private Sub Form_Load() Dim a As Currency a = hexToDec("FFFFFFFF") Debug.Print a
End SubPrivate Function hexToDec(strNum As String) As Currency Dim temp As Currency Dim a As String Dim b As Integer
For i = Len(strNum) To 1 Step -1 a = Mid(strNum, i, 1) Select Case a Case "F" b = 15 Case "E" b = 14 Case "D" b = 13 Case "C" b = 12 Case "B" b = 11 Case "A" b = 10 Case Else b = a End Select temp = temp + b * 16 ^ (i - 1) Next hexToDec = temp End Function
Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" (pDest As Any, _ pSrc As Any, _ ByVal ByteLen As Long)Private Sub Form_Load() Dim l As Long l = &HFFFFFFFF Dim c As Currency CopyMemory c, l, 4 c = c * 10000 Debug.Print c End Sub
CDec转换后与计算器万位开始对不上
To 啊炮: 最好&H0~&HFFFFFFFFFFFFFFFF能用一个通用函数来转换。你在10楼的代码有局限性
Private Sub Form_Load() Debug.Print HexToDec("FFFF") Debug.Print HexToDec("FFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFFFFFFF") End SubPrivate Function HexToDec(ByVal sHex As String) As Variant Dim lLen As Long lLen = Len(sHex) If lLen <= 4 Then HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 4 + Val("&H" & sHex), Val("&H" & sHex)) ElseIf lLen <= 8 Then HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 8 + Val("&H" & sHex), Val("&H" & sHex)) ElseIf lLen <= 16 Then HexToDec = IIf(CDec(Val("&H" & sHex)) < 0, CDec(16 ^ 8) * CDec(16 ^ 8) + CDec(Val("&H" & sHex)), CDec(Val("&H" & sHex))) End If End Function
修正一下 Private Sub Form_Load() Debug.Print HexToDec("FF") Debug.Print HexToDec("FFF") Debug.Print HexToDec("FFFF") Debug.Print HexToDec("FFFFF") Debug.Print HexToDec("FFFFFF") Debug.Print HexToDec("FFFFFFFF") Debug.Print HexToDec("FFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFFFFFF") Debug.Print HexToDec("FFFFFFFFFFFFFFFF") End SubPrivate Function HexToDec(ByVal sHex As String) As Variant Dim lLen As Long lLen = Len(sHex) If lLen <= 4 Then HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 4 + Val("&H" & sHex), Val("&H" & sHex)) ElseIf lLen <= 8 Then HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 8 + Val("&H" & sHex), Val("&H" & sHex)) ElseIf lLen <= 16 Then HexToDec = IIf(CDec(Val("&H" & sHex)) < 0, CDec(16 ^ 8) * CDec(16 ^ (lLen - 8)) + CDec(Val("&H" & sHex)), CDec(Val("&H" & sHex))) End If End Function
判断,当CLng返回值小于0的时候,转换成CDbl,然后加上2147483648
MsgBox HexToNumber("fffffffff")End SubPublic Function HexToNumber(ByVal strHex As String) As Currency
Dim i As Long
For i = 1 To Len(strHex)
HexToNumber = HexToNumber + Val("&H" & Mid(strHex, i, 1)) * (16 ^ (i - 1))
Next
End Function
MsgBox HexToNumber("a143")
End SubPublic Function HexToNumber(ByVal strHex As String) As Currency
Dim i As Long
For i = 1 To Len(strHex)
HexToNumber = HexToNumber + Val("&H" & Mid(strHex, i, 1)) * (16 ^ (Len(strHex) - i))
Next
End Function
Private Sub Form_Load()
Dim a As Currency
a = hexToDec("FFFFFFFF")
Debug.Print a
End SubPrivate Function hexToDec(strNum As String) As Currency
Dim temp As Currency
Dim a As String
Dim b As Integer
For i = Len(strNum) To 1 Step -1
a = Mid(strNum, i, 1)
Select Case a
Case "F"
b = 15
Case "E"
b = 14
Case "D"
b = 13
Case "C"
b = 12
Case "B"
b = 11
Case "A"
b = 10
Case Else
b = a
End Select
temp = temp + b * 16 ^ (i - 1)
Next
hexToDec = temp
End Function
两字节
IIf(Val("&HFFFF") < 0, 16 ^ 4 + Val("&HFFFF"), Val("&HFFFF"))
四字节
IIf(Val("&HFFFFFFFF") < 0, 16 ^ 8 + Val("&HFFFFFFFF"), Val("&HFFFFFFFF"))
8字节
IIf(CDec(Val("&HFFFFFFFFFFFFFFFF")) < 0, CDec(16 ^ 8) * CDec(16 ^ 8) + CDec(Val("&HFFFFFFFFFFFFFFFF")), CDec(Val("&HFFFFFFFFFFFFFFFF")))
Lib "kernel32" _
Alias "RtlMoveMemory" (pDest As Any, _
pSrc As Any, _
ByVal ByteLen As Long)Private Sub Form_Load() Dim l As Long l = &HFFFFFFFF Dim c As Currency CopyMemory c, l, 4
c = c * 10000
Debug.Print c
End Sub
Debug.Print HexToDec("FFFF")
Debug.Print HexToDec("FFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFFFFFFF")
End SubPrivate Function HexToDec(ByVal sHex As String) As Variant
Dim lLen As Long
lLen = Len(sHex)
If lLen <= 4 Then
HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 4 + Val("&H" & sHex), Val("&H" & sHex))
ElseIf lLen <= 8 Then
HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 8 + Val("&H" & sHex), Val("&H" & sHex))
ElseIf lLen <= 16 Then
HexToDec = IIf(CDec(Val("&H" & sHex)) < 0, CDec(16 ^ 8) * CDec(16 ^ 8) + CDec(Val("&H" & sHex)), CDec(Val("&H" & sHex)))
End If
End Function
Private Sub Form_Load()
Debug.Print HexToDec("FF")
Debug.Print HexToDec("FFF")
Debug.Print HexToDec("FFFF")
Debug.Print HexToDec("FFFFF")
Debug.Print HexToDec("FFFFFF")
Debug.Print HexToDec("FFFFFFFF")
Debug.Print HexToDec("FFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFFFFFF")
Debug.Print HexToDec("FFFFFFFFFFFFFFFF")
End SubPrivate Function HexToDec(ByVal sHex As String) As Variant
Dim lLen As Long
lLen = Len(sHex)
If lLen <= 4 Then
HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 4 + Val("&H" & sHex), Val("&H" & sHex))
ElseIf lLen <= 8 Then
HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 8 + Val("&H" & sHex), Val("&H" & sHex))
ElseIf lLen <= 16 Then
HexToDec = IIf(CDec(Val("&H" & sHex)) < 0, CDec(16 ^ 8) * CDec(16 ^ (lLen - 8)) + CDec(Val("&H" & sHex)), CDec(Val("&H" & sHex)))
End If
End Function
例如你所说的FFFFFFFF应该用CLng("&H" & "FFFFFFFF")转换
Dim lLen As Long
lLen = Len(sHex)
If lLen <= 4 Then
HexToDec = IIf(Val("&H" & sHex) < 0, 16 ^ 4 + Val("&H" & sHex), Val("&H" & sHex))
ElseIf lLen <= 8 Then
HexToDec = IIf(Val("&H" & sHex) < 0, CDec(16 ^ 8) + Val("&H" & sHex), Val("&H" & sHex))
ElseIf lLen <= 16 Then
HexToDec = CDec(16 ^ 8) * IIf(Val("&H" & Left(sHex, lLen - 8)) < 0, CDec(16 ^ (lLen - 8) + Val("&H" & Left(sHex, lLen - 8))), CDec(Val("&H" & Left(sHex, lLen - 8)))) + IIf(Val("&H" & Right(sHex, 8)) < 0, CDec(16 ^ 8) + Val("&H" & Right(sHex, 8)), CDec(Val("&H" & Right(sHex, 8))))
End If
End Function
Debug.Print Hex2Dec("FFFFFFFF")
End SubFunction Hex2Dec(ByVal num$)
Dim i%, hexNum$, newNum# hexNum = "0123456789abcdef"
num = LCase(num)
For i = 1 To Len(num)
newNum = newNum * 16 + InStr(hexNum, Mid$(num, i, 1)) - 1
Next
Hex2Dec = newNum
End Function