现有一个16进制数:FFFFFFFF 用windows自带的计算器将其转为10进制数为:4294967295 而我用vb6的clng函数转换的结果为-1
我要的是4294967295而不是-1,该怎样转换,哪位大虾贴个源码出来,多谢。

解决方案 »

  1.   

    因为有符号4字节整数的范围阿。
    判断,当CLng返回值小于0的时候,转换成CDbl,然后加上2147483648
      

  2.   

    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
      

  3.   

    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
      

  4.   

    iif(&HFFFFFFFF<0,16^8+&HFFFFFFFF,&HFFFFFFFF)
      

  5.   


    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
      

  6.   

    感谢以上网友的热心帮助,同时再问一个问题:如果16进制数是:FFFFFFFFFFFFFFFF 的话,用计算器可以全部算出,而用以上各位的代码会产生溢出错误,请问代码该如何修改?谢谢。
      

  7.   

    IIf(CDec(Val("&HFFFFFFFFFFFFFFFF"))<0,CDec(16^8)*CDec(16^8)+CDec(Val("&HFFFFFFFFFFFFFFFF")),CDec(Val("&HFFFFFFFFFFFFFFFF")))
      

  8.   

    总结一下
    两字节
    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")))
      

  9.   

    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
      

  10.   

    CDec转换后与计算器万位开始对不上
      

  11.   

    To 啊炮:   最好&H0~&HFFFFFFFFFFFFFFFF能用一个通用函数来转换。你在10楼的代码有局限性
      

  12.   

    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
      

  13.   

    修正一下
    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
      

  14.   

    任意取了一个数&H1234567890123 转为10进制数不对
      

  15.   

    任意取了一个数&H1234567890123 转为10进制数不对
      

  16.   

    在VB中16进制的数字前先加 &H
    例如你所说的FFFFFFFF应该用CLng("&H" & "FFFFFFFF")转换
      

  17.   

    Private 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, 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
      

  18.   

    主要问题在于Val仅能转换"&HFFFFFFFF",超过8位无法处理,所以要把字符串分两次处理
      

  19.   

    不用那么麻烦吧Private Sub Form_Load()
      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