How do I convert hex number to decimal number using a shell script under UNIX / Linux operating systems?
Hexadecimal (hex) is a numeral system with a radix, or base, of 16. It uses sixteen distinct symbols, most often the symbols 0–9 to represent values zero to nine, and A, B, C, D, E, F (or a through f) to represent values ten to fifteen.
bc - An arbitrary precision calculator language
There is no need to write a shell script. You can simply use the following syntax at the shell prompt to convert hex to decimal number or vice versa.
bc: Hexadecimal or Binary Conversion
To convert to decimal, set ibase to 16, enter:
echo "ibase=16; hex-number"|bc echo "ibase=16; FFF"|bc
Sample output:
4095
To convert to hexadecimal, set obase to 16, enter:
echo "obase=16; decimal-number"|bc echo "obase=16; 10"|bc
Sample output:
A
ibase and obase define the conversion base for input and output numbers under bc. The default for both input and output is base 10. Add following function to your ~/.bashrc:
h2d(){ echo "ibase=16; $@"|bc } d2h(){ echo "obase=16; $@"|bc }
The above two functions can be used from the command line as follows:
$ h2d 100
$ d2h AC
Base conversion using printf shell builtin
You can also use printf a shell builtin as well as /usr/bin/printf. To convert decimal to hex, you'd type:
printf "%x\n" 4095
Sample outputs:
fff
To convert hex to decimal, you'd type:
printf "%d\n" 0xfff
Sample outputs:
4095
You can save result to a shell variable and print it using printf or echo command:
output=$(printf "%d\n" 0xfff) echo "${output}" printf "%d\n" $output
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop














{ 22 comments… read them below or add one }
Hi.
A great post. Thank you for sharing.
BTW, a small correction, I think you swapped the function names h2d/d2h by mistake.
Will surely write about this in my blog. will give you the credits of course.
Thanks again.
Hello,
Thank you for the tip.
wcalc is also a handy way to do such convertions, and I found it easier to use :
To convert from hex to decimal :
$ echo “0xff”|wcalc -d
= 255
To convert from decimal to hex:
echo “255″|wcalc -h
= 0xff
Binary and octal bases are also handled., and there is a _lot_ of others options !
I tried this but i am not able to do this.
I edited “~/.bashrc ” file copy and pasted the above code.
@Sanjeev,
You need to logout and login again so that functions get loaded.
@Loïc Pefferkorn
Thanks for sharing wcalc tool.
You can also source your .bashrc file:
. ~/.bashrc
There’s an error on d2h. It’s ibase=16 to change input format to hex.
This gives the right value AC -> 172
Thanks, these days I am working on some byte level code reading file offsets and I was using a calculator to do this conversion. Never thought of this. Saved me lots of time. Especially the trick of adding to the .bashrc file, neat.
How about just using printf, for example:
convert dec to hex:
$ printf “%x” 100
convert hex to dec:
$ printf “%d” 0xf4
simple and easy way.
0xac != 99, which one should see on a first glance or at least manually check before posting.
bc defaulting to decimal for input AND output saved you in your first example.
Finally clobbering and depending on the .bashrc when there is printf on every unix is unnecessary.
aptitude install gbase && man gbase
:)
I agrre with Mockey Chen.
convert dec to hex:
$ printf “%x” 100
convert hex to dec:
$ printf “%d” 0xf4
Or simply do in bash (for hex to dec. conversion):
echo $((0×100))
One more way I know.
from dec. to hex. conversion:
$echo ‘ibase=10; obase=16; 1237184449′ | bc
49BDEFC1
from hex. to dec. conversion: (here you specify obase in hex notation ( A=10 )
$echo ‘ibase=16; obase=A; 49BDEFC1′ | bc
1237184449
this command fail to give me the result on base 10, im i writing it the wrong way ?
echo "ibase=2;obase=10;111101101" | bcwhen i omit obase i have the right answer exp:
echo "ibase=2;111101101" | bcwhich is :493I’m using bc 1.06.94
As others have mentioned, there is so much wrong with this article. Someone needs to update it.
drpyro: what is not mentioned is once you set ibase, all numbers after are treated in that base. For your code, it should look like this:
echo "ibase=2; obase=1010; 111101101" | bcGet it? The obase number has to be in binary (1010b = 10 decimal).
Hi,
You can use the following command to convert from any to any base.. for example binary to dec and dec to binary
# perl -e ‘printf “%b\n” 10′
1010
# perl -e ‘printf “%d\n” 0b1010′
10
how the conversion will possible when a user will give a number on his choice or from command line argument.
to JA & drpyro:
yes, interesting, seems like once you set “ibase=2″, it treats the number in the subsequent “obase=10″ in binary and interprets it as a decimal “2″ and accordingly instructs to output in binary form, therefore producing the initial binary input number.
But you needn’t fuss over converting the decimal “10″ to binary “1010″ just to let bc interpret obase correctly – just specify the “obase=10″ before specifying the ibase:
Your perl-example is a “,” after the format-part missing:
# perl -e ‘printf “%b\n”, 10′
1010
# perl -e ‘printf “%d\n”, 0b1010′
10
Thanks dude for the minor correction
#!/bin/bash #hextodec #convert any number of hex numbers to decimal #use "silent" as an argument to get briefer output for subsequent arguments. Example #hextodec abc silent fff if [[ ! $1 ]] then echo convert any number of hex numbers to decimal echo use \"silent\" as an argument to get briefer output for subsequent arguments. Example echo $0 abc silent fff fi for hex in $* do if [[ "$hex" == silent ]] then silent=1 continue else if [[ "${hex/[^0-9A-Fa-f]}" != "$hex" ]] then echo "\"$hex\" is not a hex number - just use hex digits" continue fi fi let value=0x$hex if (( ! silent )) then echo -n "hex 0x$hex = decimal " fi echo $((value)) done————————————————————————–
#!/bin/bash #convert any number of binary numbers to hex #use "silent" as an argument to get briefer output for subsequent arguments. Example #bintohex 11111 silent 111111 if [[ ! $1 ]] then echo convert any number of binary numbers to hex echo use \"silent\" as an argument to get briefer output for subsequent arguments. Example echo $0 11111 silent 111111 fi for binary in $* do if [[ "$binary" == silent ]] then silent=1 continue else if [[ "${binary/[^01]}" != "$binary" ]] then echo "\"$binary\" is not a binary number - just use 0's and 1's" continue fi fi let value=2#$binary if (( ! silent )) then echo -n "binary 2#$binary = hexadecimal 0x" fi printf "%X\n" $value doneA major problem with the people suggesting printf is the lack of precision compared to bc. Consider the following
vs
There is a little gui app for doing this. Anyone knows it’s name? I’ve installed it but I can’t remember it’s name so I cant launch it lol