I have a context where I need to convert binary to hexadecimal and decimal and viceversa in a shell script. Can someone suggest me a tool for this?


7 Answers 7


It's fairly straightforward to do the conversion from binary in pure bash (echo and printf are builtins):

Binary to decimal

$ echo "$((2#101010101))"

Binary to hexadecimal

$ printf '%x\n' "$((2#101010101))"

Going back to binary using bash alone is somewhat more complex, so I suggest you see the other answers for solutions to that.

  • how about decimal to hexadecimal.
    – Bangi
    Commented Feb 19, 2013 at 8:54
  • 3
    @Bangi Just do printf '%x\n' 10, for example.
    – Chris Down
    Commented Feb 19, 2013 at 10:14
  • 1
    What's the point of using printf %d for bin2dec? $(( ... )) already gives a decimal result, echo is enough. Commented Feb 19, 2013 at 13:42
  • @AndreaCorbellini - Personal preference. In general, I use printf '%s\n' foo instead of echo for a variety of reasons (mostly portability), for the same reason, I don't use it here.
    – Chris Down
    Commented Feb 20, 2013 at 5:24
  • @ChrisDown: I though this question was explicitly about Bash (which has a well-implemented echo builtin). My bad! Commented Feb 20, 2013 at 9:49

Assuming that by binary, you mean binary data as in data with any possible byte value including 0, and not base-2 numbers:

To convert from binary, od (standard), xxd (comes with vim) or perl's unpack come to mind.

od -An -vtu1 # for decimal
od -An -vtx1 # for hexadecimal

xxd -p # for hexa

perl -pe 'BEGIN{$\="\n";$/=\30};$_=unpack("H*",$_)' # like xxd -p

# for decimal:
perl -ne 'BEGIN{$\="\n";$/=\30;$,=" "}; print unpack("C*",$_)'

Now, to convert back to binary, awk (standard), xxd -r or perl's pack:

From the decimal output from od -tu1 or perl above:

LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'

From the hexa perl or xxd -p above:

xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'
  • xxd -r gives binary data, not ascii equivalent of hex data. ie 11111111 in binary file is FF in hex data. The question is asking to give 11111111 in ascii (displayable on screen)
    – Zimba
    Commented Jan 29, 2021 at 4:13

You can use bc for this by manipulating the ibase and obase parameters:

The trick is that you need to be explicit about the bases. So if your ibase is 2, then if you set your obase to 10, it won't do anything, as 10 in binary is 2. Hence you need to use hexadecimal notation.

So binary to decimal would be (watch that obase is A)

Binary to decimal:

$> echo 'ibase=2;obase=A;11110001011010'|bc

Binary to hex:

$> echo 'ibase=2;obase=10000;11110001011010'|bc

If the 'output base' obase is changed first, it should be easier:

$> echo 'obase=10;ibase=2;11110001011010'|bc
$> echo 'obase=16;ibase=2;11110001011010'|bc
  • 6
    This second example is wrong -- 'F' would be base 15, not 16 (decimal 16 in hex is 10, not F). Try echo 'ibase=2;obase=F;1111 which should equal decimal 15, ie. F in hex. It comes out as 10, which it is in base 15 (digits 0-E). It is also easier if you state the obase first, eg: echo 'obase=16;ibase=2;1111'|bc. No confusion.
    – goldilocks
    Commented Feb 19, 2013 at 7:21
  • 3
    Now it is worst. Once you set ibase, you have to provide input in that base, even for obase. So in your example would be echo 'ibase=2;obase=10000;11110001011010'|bc. Better listen to goldilocks's advice and reverse the order – first set obase, then ibase.
    – manatwork
    Commented Feb 26, 2013 at 18:08

If you mean converting numbers from base-2 to 10 or 16 and back, bc is the standard tool to do that as already mentioned by psarossy.

binary=$(echo "obase=2;$decimal" | bc)
hex=$(echo "obase=16;ibase=2;$binary" | bc)

Some shells like zsh have builtin support for base conversion as part of their arithmetic expansion operators:


and so on.

Both ksh93 and zsh also support:

typeset -i2 binary=123
typeset -i16 dec2hex=123 bin2hex='2#1111'

But note that, when expanded, $binary will have a 2# or 16# prefix (which you can strip with ${binary#*#}.

ksh93 also supports:

printf "%..2d\n" 123

to convert to binary.

  • Some printf implementations allow for binary numerals: printf '%02X' '0B1111' can print 0F in some shells. Commented Nov 22, 2023 at 22:04
  • Usually, when converting to binary/hexadecimal, people expect the representation of the input number (i.e. without sign before the binary/hex output). For example, your bc solution, for a decimal input of -1, gives a bin/hex output of -1, where we could expect 111....111/ffff...ffff.
    – Bruno
    Commented Feb 3 at 9:46
  • @Bruno, I don't really agree. How your C compiler stores numbers as short/int/long/float/double on your computer architecture and how to get a hex dump of that is quite a different question from how to convert a number from one base to another and would be a different question. Commented Feb 3 at 12:35
  • @StéphaneChazelas, as you want, I only said usually, both are valid of course... At least for me: When I ask for binary, I want to see the bits - same as printf "%x\n" does for hex, not something I need to convert again to see if bit 3 is set or not ;-)
    – Bruno
    Commented Feb 3 at 20:01

For binary to hexadecimal use: xxd tool in linux and for binary to decimal you can use qalculate tool.

For help regarding xxd type xxd --help or man xxd in Linux.


As mentioned in previous answer you can do Binary to Decimal and Hexa Decimal as follows in Bash using echo and printf. I am just adding here how to convert from Decimal and Hex to binary using pure Bash.

Binary to Decimal using echo

echo "$((2#101010101))"

Binary to Hexa-Decimal using printf

printf '%x\n' "$((2#101010101))"

Integer decimal to Binary conversion using only Bash

Using only Bash, if you would like to convert decimal to binary, you can do it like the following:

touch dec2bin && chmod +x "$_" && vim "$_"

And then copy and paste the following:

## converting decimal integer to binary, pass int as a parameter
{   [ "$num" == "" ] && { printf "Error: Pass an integer\n"; exit 1; };
    op=2; ## Since we're converting to binary
    quo=$(( $num / $op)); rem=$(( $num % $op)); ## quotient and remainder
    remarray=(); ## array for putting remainder inside array
    remarray+=("$rem"); ## array expansion
        until [[ $quo -eq 0 ]]; do
            num=$quo; quo=$(( $num / $op)); ## looping to get all remainder untill 0
            rem=$(( $num % $op)); remarray+="$rem"; ## array expansion
    binary=$(echo "${remarray[@]}" | rev); ## reversing array
    printf "$binary\n"; ## printing reversed array
{   [[ -n ${num//[0-9]/} ]] &&
        { printf "Error: $num is not an integer bruv!\n"; return 1;
        } || { dec2bin $num; }

And then try it from where you saved:

./dec2bin 420

Integer must be added!!

./dec2bin 420.py
420.py is not an integer bruv!

Hexadecimal to Binary conversion using only Bash

Similarly, hexadecimal to binary, as follows using only bash:

## converting hexadecimal to binary, pass hex as a parameter
{   [ "$hex" == "" ] && { printf "Error: Pass a hex\n"; exit 1; };
    op=2; num=$((16#$hex)); ## converting hex to integer
    quo=$(( $num/ $op)); rem=$(( $num% $op)); ## quotient and remainder
    remarray=(); remarray+=("$rem"); ## array expansion
        until [[ $quo -eq 0 ]]; do
            num=$quo; quo=$(( $num / $op)); ## looping to get all remainder untill 0
            rem=$(( $num % $op)); remarray+="$rem"; ## array expansion
    binary=$(echo "${remarray[@]}" | rev); ## reversing array
    printf "$binary\n"; ## printing reversed array
[[ -n ${hex//[0-9,A-F,a-f]/} ]] &&
    { printf "Error: $hex is not a hex bruv!\n"; return 1;
    } || { hex2bin $hex; }

For example:

./hex2bin 1aF

Hex must be passed:

./hex2bin.bash XyZ
XyZ is not a hexa decimal number bruv!

You can use PHP:

$ php -r 'printf("%b", 11);'

Or Perl:

$ perl -e 'print unpack("B*", pack("c", 11))'

$ perl -e 'print unpack("B*", pack("C", 11))'

$ perl -e 'print unpack("B*", pack("W", 11))'

$ perl -e 'print unpack("B*", pack("n", 11))'

$ perl -e 'print unpack("B*", pack("N", 11))'

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .