==========================================================
Exercise 2.3 - Converting Hexadecimal Digits Into Integers
==========================================================
Question
========
Write a function htoi(s), which converts a string of hexadecimal digits
(including an optional 0x or 0X) into its equivalent integer value. The
allowable digits are 0 through 9, a through f,and A through F.
.. literalinclude:: cprogs/ex_2.3_htoi.c
:language: c
Explanation
===========
In this program we are going to convert a string of hexadecimal digits into
integer value. If give input as `F` then the output should be 15. This is done
by the htoi function::
int htoi(char s[])
{
int hexdigit,i,inhex,n;
i = 0;
if( s[i] == '0')
{
++i;
if(s[i] == 'x' || s[i] == 'X')
++i;
}
n = 0;
inhex = YES;
for(;inhex==YES;++i)
{
if(s[i] >='0' && s[i] <='9')
hexdigit= s[i] - '0';
else if(s[i] >='a' && s[i] <='f')
hexdigit= s[i] -'a' + 10;
else if(s[i] >='A' && s[i] <='F')
hexdigit= s[i] -'A' + 10;
else
inhex = NO;
if(inhex == YES)
n = 16 * n + hexdigit;
}
return n;
}
In the above fragment of the program we declare some variables such as hexdigit
for storing each digit in hexadecimal ,i as a counter,inhex as flag to see if we
are still looking a hexadecimal and finally n where we store our converted
hexadecimal number.
First we strip off any characters which look like `0x` or `0X` and then we enter
to convert rest of the characters. Then we start the conversion process, we set
the flag index to YES and n to 0.
Then in the for loop as long as index is YES, then we check each character 0 to
9, a to f or A to F. If we find 0 to 9, we store the value char - `0`, if we
find a character between a to f, we store char - `a` + 10, becase hexadecimal
'a' is decimal 10 and similar for character range capital A to F.
Then we take each hex digit and for it's position or previous value stored in n,
we mutiply by 16 and add hexdigit.
.. code-block:: c
if(inhex == YES)
n = 16 * n + hexdigit;
For example to convert **0XAF**.
.. code::
1. We strip off 0X.
2. For A, we get the value hexdigit = 10
3. n = 16 * 0 + 10
= 10
4. We gather F, we store hexdigit = 'F' - 'A' + 10;
= 70 - 65 + 10; (70 is ascii value for F, 65 is ascii value for A)
= 15
5. n = 16 * n + hexdigit
= 16 * 10 + 15
= 160 + 15
= 175
175
Visualization
=============
.. raw:: html
Try It Out
==========
.. raw:: html