ASCII to Binary and Binary to ASCII conversion tools?
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
-e expression
evaluate the given expression asperl
code-p
:sed
mode. The expression is evaluated for each line of input, with the content of the line stored in the$_
variable and printed after the evaluation of the expression.-l
: even more likesed
: instead of the full line, only the content of the line (that is, without the line delimiter) is in$_
(and a newline is added back on output). Soperl -lpe code
works likesed code
except that it'sperl
code as opposed tosed
code.unpack "B*"
works on the$_
variable by default and extracts its content as a bit string walking from the highest bit of the first byte to the lowest bit of the last byte.pack
does the reverse ofunpack
. Seeperldoc -f pack
for details.
With spaces:
$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB
(it assumes the input is in blocks of 8 bits (0-padded)).
With unpack "(B8)*"
, we extract 8 bits at a time, and we join the resulting strings with spaces with join " "
.
You can use xxd
to convert from ASCII and binary.
$ echo -n "A" | xxd -b
0000000: 01000001 A
$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
Converting bases
If you're looking to do just base conversions between Hex, Octal, & Dec I usually use the basic calculator command line tool (bc
) to do such things.
Note that bc
is always very picky about the correct order of bases: you have to specify the resulting base (obase
) first, then add your choice of ibase
.
$ echo "obase=2; ibase=16; A" | bc
1010
$ echo "obase=16; ibase=2; 1010" | bc
A
Using bc and bash:
#!/bin/bash
chrbin() {
echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}
ordbin() {
a=$(printf '%d' "'$1")
echo "obase=2; $a" | bc
}
ascii2bin() {
echo -n $* | while IFS= read -r -n1 char
do
ordbin $char | tr -d '\n'
echo -n " "
done
}
bin2ascii() {
for bin in $*
do
chrbin $bin | tr -d '\n'
done
}
ascii2bin "This is a binary message"
bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101