2012-06-20 10 views
8

Sto provando a convertire una serie di byte da hex a bin usando bash. ma continuo a ricevere (apparentemente casuale) "(standard_in) 1: errore di sintassi", risponde dal codice seguente:Conversione da Hex a Binary 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 

ho fatto una cosa simile con dicembre a bin, che funziona perfettamente bene:

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

Qualcuno ha un'idea del motivo per cui funziona con decimale, ma non con hex? A mio parere la sintassi è più o meno lo stesso (a meno che non mi manca qualcosa di veramente difficile.)

+0

Possibile duplicato di [script di shell linux: stringa esadecimale in byte] (https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes) –

risposta

13

aC è un po 'sensibile a caso per i valori esadecimali, cambiare in maiuscolo e dovrebbe funzionare

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 

uscita:

11000100 
10010111 
10010001 
10001100 
10000101 
10000111 
11000100 
10010000 
10001100 
10001101 
10011010 
10000011 
10000001 
+0

quindi è stato davvero un semplice errore. grazie per averlo indicato, funziona come un fascino. – fragman

+0

contento di aiutare, BC è un ottimo strumento con alcune stranezze che devi solo sapere :-) –

+0

Qualcuno sa come si fa a battere l'output di bc su un certo numero di cifre? Questo non è necessario nell'esempio sopra, ma prova il loop con 00 come input. –

4

Ecco lo script che uso:

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

: I numeri esadecimali devono essere preceduti da '0x' e la colonna ** HEX ** elenca effettivamente i valori decimali. Ma grazie per aver offerto una soluzione bash pura ad una domanda "How to ... in bash"! A volte questo è in realtà ciò che le persone stanno cercando. Non puoi sempre dipendere dalla presenza di strumenti come bc. –

+0

la versione di bash che sto usando ('4.4.12') non ha bisogno di prefisso i numeri esadecimali. Lo script non gestisce correttamente '0', tuttavia, si desidera sostituire' $ Binary' con '$ {Binary: -0}' nell'ultima chiamata 'echo' – untore