2012-06-20 5 views
8

J'essaye de convertir une série d'octets d'hex en bin en utilisant bash. mais je continue à obtenir (apparemment aléatoire) « (standard_in) 1: erreur de syntaxe » répond à partir du code ci-dessous:Conversion de Hex en binaire en 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 

Je l'ai fait une chose similaire avec rabattant pour bin, qui fonctionne parfaitement bien:

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

Quelqu'un at-il une idée de la raison pour laquelle cela fonctionne avec des décimales, mais pas avec hex? À mon avis, la syntaxe est à peu près la même (à moins que je me manque quelque chose de vraiment dur.)

+0

possible duplication de [script linux shell: chaîne hexadécimale en octets] (https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes) –

Répondre

13

BC est un peu sensible à la casse pour les valeurs hexagonales, changer en majuscules et il devrait fonctionner

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 

sortie:

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

donc c'était vraiment une simple erreur. merci de le signaler, fonctionne comme un charme. – fragman

+0

heureux d'aider, BC est un excellent outil avec quelques bizarreries que vous avez juste besoin de savoir :-) –

+0

Est-ce que quelqu'un sait comment remplir la sortie de bc à un certain nombre de chiffres? Ce n'est pas nécessaire dans l'exemple ci-dessus, mais essayez simplement la boucle avec un 00 comme entrée. –

4

Voici le script que j'utilise:

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

Avertissements: Les nombres hexadécimaux doivent être précédés de '0x', et la colonne ** HEX ** répertorie en fait les valeurs décimales. Mais merci d'offrir une solution bash pure à une question "Comment ... en bash"! Parfois, c'est vraiment ce que les gens recherchent. Vous ne pouvez pas toujours dépendre de la présence d'outils comme bc. –

+0

La version de bash que j'utilise ('4.4.12') n'a pas besoin de préfixer les nombres hexadécimaux. Le script ne gère pas correctement '0', vous voulez remplacer' $ Binary' par '$ {Binary: -0}' dans le dernier appel 'echo' – untore