` Printed Icetips Article

Icetips Article



Par2: Hex to decimal conversion
1999-01-31 -- Eric Churton
 
This question has often come up. If one understands what one is trying to do, then it 
becomes possible to work out one or more solutions. Hopefully the following observations 
will help somebody.

Bear in mind that there are lots of different (and probably better) ways of doing these 
conversions (usually involving arrays), but I have worked these methods out so that 
they are reasonable easy to understand, improve on and duplicate. In computer 
programming skinning a cat is often done in a hurry, so one tends to use the first method

one thinks of!

1. Converting Decimal to Hex

Lets compare decimal with hexadecimal. Decimal numbers are represented by
10 possible characters: 0123456789, anytime 9 is exceeded you bump up a 1 on
the left and make '9' '0' - thus 9 + 1 becomes 10 and 99 + 1 becomes 100.
Hexadecimal numbers are represented by 16 possible characters 0123456789ABCDEF, 
in this instance when F is exceeded you bump up 1 on the left and turn the F into 0. A 
represents decimal 10, B represents decimal 11 etc - thus F + 1 becomes 10 and FF + 1
becomes 100 (every sixteenth character rather than every 10th turns the odometer over).

Remember that the actual *value* of the number is the same whatever form it is displayed 
in. In other words, what you are trying to do is to take a number and represent it as a 
string in different formats - the same way you can take a LONG and display it as
different
date formats.

If you have a string to place the result into you could work on the following basis:
keep looping until your number -1 = 0, your number being the one you want to
convert

Increment the rightmost character by one i.e. 0 1 2 3 4 5 6 7 8 9 A B C D E F, testing to

see if 'F' has been reached. 

If it has been reached set it back to 0 and increment the next character on
the left by 1, first testing to see if 'F' has been reached. If it has been reached, set
it to 0 you move a further character to the left, repeating the process until you reach 
the start of the string or the current character is less than 'F'

This is a simple counter, and if you display it between increments it will
show a speedometer type counter.

Once you realise how this works, you can short-circuit it by using division
and modulus. By having a string of 16 characters e.g. Hexchars = '0123456789ABCDEF'
you can select the value by using string slicing 

Hexchars STRING(16)
hexdisplaystring  STRING(30) ! Can handle up to 30 characters - use a
different length if you need to
stringposition SHORT ! will point to the character you are handling
number LONG ! holds the value you want to convert - prime this before
using...
tempnumber LONG ! use this for working so number is not affected

CODE

Hexchars = '0123456789ABCDEF'
clear(hexdisplaystring)
stringposition = len(hexdisplaystring)
tempnumber = number

LOOP WHILE (tempnumber AND stringposition) ! if you run out of number or

space this will end the loop
        hexdisplaystring[stringposition] = hexchars[tempnumber%16 + 1] !

fetch hex char
  tempnumber = tempnumber/16 ! the rightmost char is finished with so
adjust
the value - dividing a long loses the remainder (or modulus, depending
on
how old you are)
  stringposition -= 1 ! next char
!note: either stringposition will become 0 or tempnumber will become 0
! you can test for overflow here if you want to e.g
! if not stringposition AND tempnumber - i.e. you still have a value to

evaluate but no space
!Message ('The number is too large for the string')
! hexdisplaystring = 'Overflow' ! or '' or whatever you want to do
END

Here it is without comments, (and tested....)
! NOTE: you can create the hexchars variable in the Data of the
procedure,
setting initial value to 0123456789ABCDEF

      clear(hexdisplaystring)
      stringposition = len(hexdisplaystring)
      tempnumber = number
      LOOP WHILE (tempnumber AND stringposition)
        hexdisplaystring[stringposition] = hexchars[tempnumber%16 + 1]
        tempnumber = tempnumber/16
        stringposition -= 1 ! next char
        if stringposition = 0 and tempnumber
        message('Overflow')
        end
      END

2. Hex to decimal

    This is much easier because it just consists of adding up the values
of each character of the hex string. Thus:

hexstring string(30)
number (long) ! where you will store the number
stringposition LONG
counter LONG
tempnumber LONG
! you would first prime the hexstring with a hexadecimal string

CODE
      number = 0 ! start with nothing
      stringposition = len(clip(hexstring))
      tempnumber = 0
      counter = 0
      LOOP WHILE (stringposition ) ! stop when you have evaluated the
whole string
       if not counter ! i.e. the first time through
       counter = 1
       else
       counter = counter * 16 !  16 256 4096 65536 etc
       end
        CASE hexdisplaystring[stringposition]
         OF '0' to '9'
            number +=  counter * hexdisplaystring[stringposition]
         ELSE
        number += counter * (10 + (
VAL(hexdisplaystring[stringposition])  - VAL('A') ) )
! this puts 'A' to 10, 'B' to 11 and so on - make sure that the string
entered is UPPER or amend this code to change to UPPER
        END
        tempnumber += 1
       stringposition -= 1
      END

This also has been tested.

Most of the time solving this sort of problem is very difficult if you
don't
know what you are trying to accomplish. I think Russell Egan has often
said
(something like) when you have a problem and there is any part of it you

don't understand, go back a step until you understand that part.

Arnor Baldvinson notes that there is a sample app shipping with Clarion showing how
to do hex-decimal conversions.



Printed November 21, 2024, 6:57 am
This article has been viewed/printed 35254 times.