x
Solved

# converting decimal to hex in a ksh script

Posted on 1999-01-12
Medium Priority
815 Views
In a KSH script, I need to take an IP address and convert it to host long, which is a HEX format.
for example: 10.10.20.21 in hex is 168432661
Is there an easy wasy to do this?
0
Question by:jwcorbett

LVL 51

Accepted Solution

ahoffmann earned 200 total points
ID: 1295388
for the result in your question (which is decimal not hex):
echo 10.10.20.21 | awk -F. '{printf "0x%x", (\$1*256*256*256)+(\$2*256*256)+(\$3*256)+\$4;}
or if you want hex:
echo 10.10.20.21 | awk -F. '{printf "0x%x", (\$1*256*256*256)+(\$2*256*256)+(\$3*256)+\$4;}
0

LVL 51

Expert Comment

ID: 1295389
echo 10.10.20.21 | awk -F. '{print \$1*256*256*256)+(\$2*256*256)+(\$3*256)+\$4;}
sorry.
0

Author Comment

ID: 1295390
Thank you!
It works, with a little change in syntax, but for an IP of 10.10.20.21, I get an answer 168433e+08
How can I format the naswer to give the whole number?

0

LVL 85

Expert Comment

ID: 1295391
awk -F. '{printf "%d",(\$1*256*256*256)+(\$2*256*256)+(\$3*256)+\$4;}'
awk -F. '{printf "%08x",(\$1*256*256*256)+(\$2*256*256)+(\$3*256)+\$4;}'
But this may fail for 128.10.20.21
perl -ne 'printf"%08x",unpack"N",pack"C*",split/\./'
0

LVL 51

Expert Comment

ID: 1295392
echo 128.10.20.21 | awk -F. '{printf "%12.12d",(\$1*256*256*256)+(\$2*256*256)+(\$3*256)+\$4;}'

works for me, but depending on your OS leading chars are blanks or zeros

0

LVL 3

Expert Comment

ID: 1295393
You can do the whole job without using awk or perl:

#!/bin/ksh
IFSsave=\$IFS
typeset -i a b c d     # declare fields to be integer
IFS='.'
echo 10.10.20.21 | read a b c d
IFS=\$IFSsave

echo \$(((a<<24)+(b<<16)+(c<<8)+d))
# if a>127 the result will be a negative number
exit

0

## Featured Post

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.