Преобразование Hex в двоичный код в bash
Я пытаюсь преобразовать ряд байтов из hex в bin с помощью bash. но я продолжаю получать(казалось бы, случайные) "(standard_in) 1: синтаксическая ошибка" ответы из следующего кода:
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
Я сделал аналогичную вещь с dec в bin, которая отлично работает:
for i in {0..120}
do
        KEYBIN=$(echo "obase=2; ibase=10; $i" | bc)
        echo $KEYBIN
done
кто-нибудь знает, почему он работает с десятичной, но не с шестнадцатеричной? На мой взгляд, синтаксис почти такой же (если только я не упускаю что-то действительно сложное.)
2 ответов
BC немного чувствителен к регистру для шестнадцатеричных значений, изменяется на верхний регистр, и он должен работать
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
выход:
11000100
10010111
10010001
10001100
10000101
10000111
11000100
10010000
10001100
10001101
10011010
10000011
10000001
вот скрипт, который я использую:
#!/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 "3[1mHEX                 \t\t BINARY3[0m"
    while [ $# -ne 0 ]
    do
        DecNum=`printf "%d" `
        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  holds second argument
        unset Binary
    done
fi