2012-06-20 3 views
8

Я пытаюсь преобразовать последовательность байтов из hex в bin с помощью bash. , но я получаю (на первый взгляд случайные) «(standard_in) 1: ошибка синтаксиса» отвечает из следующего кода:Hex to Binary conversion in bash

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 

я сделал нечто подобное с дес БИН, который работает прекрасно:

for i in {0..120} 
do 
     KEYBIN=$(echo "obase=2; ibase=10; $i" | bc) 
     echo $KEYBIN 
done 

У кого-нибудь есть идея, почему он работает с десятичной, но не с шестнадцатеричным? На мой взгляд, синтаксис почти такой же (если я не хватает чего-то очень трудно.)

+0

Возможные duplicate [linux shell scripting: hex string to bytes] (https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes) –

ответ

13

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 
+0

, так что это действительно была простая ошибка. спасибо за указание на это, работает как шарм. – fragman

+0

рад помочь, BC - отличный инструмент с некоторыми причудами, которые вы только что должны знать :-) –

+0

Кто-нибудь знает, как вывести вывод bc на определенное количество цифр? Это не нужно в приведенном выше примере, но просто попробуйте цикл с входом 00. –

4

Вот сценарий я использую:

#!/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 
+0

Предостережения: шестнадцатеричным номерам должно предшествовать '0x', а столбец ** HEX ** содержит десятичные значения. Но спасибо за предложение чистого решения bash для вопроса «Как ... в bash»! Иногда это то, что люди ищут. Вы не всегда можете зависеть от наличия таких инструментов, как bc. –

+0

версия bash, которую я использую ('4.4.12'), не требует префикса шестнадцатеричных чисел. Сценарий не обрабатывает '0' правильно, но вы хотите заменить' $ Binary' на '$ {Binary: -0}' в последнем вызове 'echo' – untore