Binary To Hexadecimal And Decimal In A Shell Script


Answer :

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

Binary to decimal

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

Binary to hexadecimal

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

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


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*",$_)' 

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 15450 

Binary to hex:

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

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

$> echo 'obase=10;ibase=2;11110001011010'|bc 15450 $> echo 'obase=16;ibase=2;11110001011010'|bc 3C5A 

Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?