Reputation: 289
I'm trying to convert a series of bytes from hex to bin using bash. but I keep getting (seemingly random) "(standard_in) 1: syntax error" replies from the following code:
for j in c4 97 91 8c 85 87 c4 90 8c 8d 9a 83 81
do
BIN=$(echo "obase=2; ibase=16; $j" | bc )
echo $BIN
done
I did a similar thing with dec to bin, which works perfectly fine:
for i in {0..120}
do
KEYBIN=$(echo "obase=2; ibase=10; $i" | bc)
echo $KEYBIN
done
Does anyone have an idea why it works with decimal, but not with hex? In my opinion the syntax is pretty much the same (unless I'm missing something really hard.)
Upvotes: 21
Views: 56419
Reputation: 41
Try this:
for HEXBYTE in c4 97 91 8c 85 87 c4 90 8c 8d 9a 83 81
do
BIN=$(echo "obase=2; ibase=16; ${HEXBYTE^^}" | bc )
echo $BIN
done
Output:
11000100
10010111
10010001
10001100
10000101
10000111
11000100
10010000
10001100
10001101
10011010
10000011
10000001
Upvotes: 3
Reputation: 8805
I came up with this:
printf
converts to hex, xxd -r -p
takes the ascii hex stream and makes it actual binary
dumping with hexdump
to prove it worked...
$ printf "%016x" 53687091200 | xxd -r -p | hexdump -C
00000000 00 00 00 0c 80 00 00 00 |........|
00000008
Further reading:
Upvotes: 16
Reputation: 14910
Here's the script I use:
#!/bin/bash
# SCRIPT: hex2binary.sh
# USAGE: hex2binary.sh Hex_Number(s)
# PURPOSE: Hex to Binary Conversion. Takes input as command line
# arguments.
#####################################################################
# Script Starts Here #
#####################################################################
if [ $# -eq 0 ]
then
echo "Argument(s) not supplied "
echo "Usage: hex2binary.sh hex_number(s)"
else
echo -e "\033[1mHEX \t\t BINARY\033[0m"
while [ $# -ne 0 ]
do
DecNum=`printf "%d" $1`
Binary=
Number=$DecNum
while [ $DecNum -ne 0 ]
do
Bit=$(expr $DecNum % 2)
Binary=$Bit$Binary
DecNum=$(expr $DecNum / 2)
done
echo -e "$Number \t\t $Binary"
shift
# Shifts command line arguments one step.Now $1 holds second argument
unset Binary
done
fi
Upvotes: 7
Reputation: 45670
BC is a bit sensitive to case for hex values, change to uppercase and it should work
for j in C4 97 91 8C 85 87 C4 90 8C 8D 9A 83 81
do
BIN=$(echo "obase=2; ibase=16; $j" | bc )
echo $BIN
done
Output:
11000100
10010111
10010001
10001100
10000101
10000111
11000100
10010000
10001100
10001101
10011010
10000011
10000001
Upvotes: 25