• Decimal to Hex (A97)

    • This topic has 5 replies, 4 voices, and was last updated 22 years ago.
    Author
    Topic
    #386583

    Let’s say I have the number 21103313536 and I want to convert it to hex.

    Using Hex(21103313536) results in an overflow error.

    What is the easiest way to do this?

    Surely you can count this high in hex…

    Viewing 1 reply thread
    Author
    Replies
    • #671367

      Your number 21103313536 is larger than the largest long integer. How are you going to input this number? As a string?

      • #671368

        It will be stored as a string.

        • #671452

          As noted you could write your own function to convert decimal numbers larger than a Long Integer (2,147,483,647) to Hex, or, if lazy, “borrow” the Excel ATP Dec2Hex function, which can take a Double as its numerical argument, unlike the VB Hex function, which accepts only a Long (thus the overflow error you experienced). To use this function in Access, you’d have to set a reference to the Microsoft Office Web Components Function Library (MSOWCF.DLL) (which may or may not be installed on your system if still using Office 97). (You’d have to decide whether you want to incur the extra overhead – there’s “only” 3 class modules in this library…. also note, you cannot directly set a reference to an Excel add-in file (.XLA) in Access.) The OCATP Class provides many of the functions found in the Excel Analysis Tool-pak (ATP) add-in. Example of a wrapper function:

          Public Function owcDec2Hex(ByVal dblNum As Double)

          Dim obj As New MSOWCFLib.OCATP
          owcDec2Hex = obj.Dec2Hex(dblNum)
          Set obj = Nothing

          End Function

          Example of use (using the number in your example):

          ? owcDec2Hex(21103313536)
          4E9DB0280

          Unlike the VB Hex function, which maxes out at 2147483647, the ATP Dec2Hex function can handle any positive number up to 2^39-1 (549755813887):

          ? owcDec2Hex(2^39-1)
          7FFFFFFFFF

          ? owcDec2Hex(2^39)
          Error -536608732

          So if any of the numbers you are processing are larger than 2^39, you will have to write your own function. NOTE: The Office Web Components used to be available for download for MS Office users, but I don’t know if that’s still the case.

          HTH

          • #671644

            In further reply, if using the ATP function is not an option, here is example of a user-defined function you can use to convert large numbers (doubles) to Hex. This function will probably not win any efficiency awards, and is intended to be used with positive numbers only!! Sample code:

            Public Function GetHex(ByVal dblNum As Double, _
            ByVal intAndH As Integer) As String

            ‘ NOTE: Do not use for negative numbers!!
            ‘ intAndH 0 = no “&H”, intAndH 1 = add “&H” to Hex string
            Dim n As Integer
            Dim i As Integer
            Dim h As Integer
            Dim intHex() As Integer
            Dim strHex() As String

            ‘Determine no of “places” for hex number:
            Do
            n = n + 1
            Loop Until (16 ^ n) > dblNum

            ReDim intHex(1 To n)
            ReDim strHex(1 To n)

            For i = n To 1 Step -1
            h = h + 1
            ‘ Using Mod or Integer division results in Overflow error
            intHex(h) = Fix(dblNum / (16 ^ (i – 1)))
            dblNum = dblNum – (intHex(h) * (16 ^ (i – 1)))
            strHex(h) = Int2Hex(intHex(h))
            Next i

            If intAndH = 0 Then
            GetHex = Join(strHex, “”)
            Else
            GetHex = “&H” & Join(strHex, “”)
            End If

            Erase intHex
            Erase strHex

            End Function

            Above function uses this function to convert numerical values from 0 to 15 to corresponding Hex digit:

            Public Function Int2Hex(ByVal intNum As Integer) As String

            Select Case intNum
            Case 0 To 9
            Int2Hex = CStr(intNum)
            Case 10
            Int2Hex = “A”
            Case 11
            Int2Hex = “B”
            Case 12
            Int2Hex = “C”
            Case 13
            Int2Hex = “D”
            Case 14
            Int2Hex = “E”
            Case 15
            Int2Hex = “F”
            End Select

            End Function

            In testing, the GetHex function returned same hex values returned by VBA Hex function or the ATP Dec2Hex function, with exception noted for negative numbers, as the hex value for a negative number will vary depending on how many bits the hex value is representing. The GetHex function also was able to convert numbers larger than Dec2Hex function w/o error. Example:

            ? GetHex(2^42,0)
            40000000000

            ? atpDec2Hex(2^42)
            Error -536608732

            Note that if using ACC 97, the Join function is probably not available, you’d have to modify function to concatenate the elements of the array “manually” using something like:

            For i = 1 To n
            GetHex = GetHex & strHex(i)
            Next i
            If intAndH = 1 Then
            GetHex = “&H” & GetHex
            End If

            HTH

    • #671373

      What type of field are you trying to store it in? If the base type of number of you are dealing with is Long Integer then your max is
      2 to 31st, which is a bit more than 2,000,000,000. Your number is 21,103,313,536 which would cause an overflow.
      I don’t have Access97 available at the moment, but the XP helps says:

      [indent]
      Hex Function Returns a String representing the hexadecimal value of a number. Syntax Hex(number) The required number argument is any valid numeric expression or string expression. Remarks If number is not already a whole number, it is rounded to the nearest whole number before being evaluated. If number is Hex returns Null Null Empty Zero (0) Any other number Up to eight hexadecimal characters You can represent hexadecimal numbers directly by preceding numbers in the proper range with &H. For example, &H10 represents decimal 16 in hexadecimal notation.
      [/indent]

      In order to work with a number that big you will need to do some creative math I’m afraid, and then assign it to a string or variant type.

    Viewing 1 reply thread
    Reply To: Decimal to Hex (A97)

    You can use BBCodes to format your content.
    Your account can't use all available BBCodes, they will be stripped before saving.

    Your information: