awk, how to convert hex to decimal

Kris Stephens [Hail Eris!] krs at uts.amdahl.com
Wed Feb 6 06:20:49 AEST 1991


Here's the only semi-decent solution to this that *I* have found,
which isn't to say there's not some way to get sprintf to handle it.

# awk script to convert hex to decimal on output (an opcode in
# chars 1 and 2 of $1) and display the indexed message tagged
# by chars 2 and 3.
#
# Much much better idea to do this with C!
BEGIN {
        # Set up the conversion-array Dec[]
        for ( i = 0; i <= 9; i++ )
                Dec[i] = i
        Dec["A"] = 10
        Dec["B"] = 11
        Dec["C"] = 12
        Dec["D"] = 13
        Dec["E"] = 14
        Dec["F"] = 15
	Dec["a"] = 10
	Dec["b"] = 11
	Dec["c"] = 12
	Dec["d"] = 13
	Dec["e"] = 14
	Dec["f"] = 15

        # Message array
        Msg["0A"] = "This is message OA"
	Msg["0a"] = Msg["0A"]
        }

        {
        a = substr($1, 1, 1)
        b = substr($1, 2, 1)
        opcode = (16 * Dec[a]) + Dec[b]

        msgid = substr($1, 3, 2)
	# We won't use it, but what the heck -- convert msgid to decimal
	c = substr($1, 3, 1)
	d = substr($1, 4, 1)
	msgcode = (16 * Dec[c]) + Dec[d]

        printf("op(%d) id(%s): %s\n", opcode, msgid, Msg[msgid])
        }


By the way, a general-case conversion walks along a string, char by
char (as mentioned in another article).  Assuming that you want to
convert the character-string hex number in $1 to decimal, and the
Dec[] array has been defined as above...

	{
	a=0
	for ( i = 1; i <= length($1); i++ )
		{
		c = substr($1, i, 1)
		a = (16 * a) + Dec[c]
		}
	}

and the variable 'a' has the decimal value of (hex) $1.  The key to this
is that each successive character requires the sum of all the previously
evaluated characters to be multiplied by 16 (left-shift one char or four
bits).  For a four-char hex, char 1 is multiplied by 16 three times, char
2 twice, char 3 once, and char 4 not at all.

...Kris
-- 
Kristopher Stephens, | (408-746-6047) | krs at uts.amdahl.com | KC6DFS
Amdahl Corporation   |                |                    |
     [The opinions expressed above are mine, solely, and do not    ]
     [necessarily reflect the opinions or policies of Amdahl Corp. ]



More information about the Comp.unix.shell mailing list