2012-06-20 30 views
8

Estoy tratando de convertir una serie de bytes de hexadecimal a bin utilizando bash. pero me siguen dando (aparentemente al azar) "(standard_in) 1: error de sintaxis", responde desde el siguiente código:conversión hexadecimal a binaria 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 

hice algo similar con DEC para bin, que funciona perfectamente bien:

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

¿Alguien tiene una idea de por qué funciona con decimal, pero no con hex? En mi opinión la sintaxis es más o menos el mismo (a menos que me falta algo muy duro.)

+0

Posible duplicado de [linux shell scripting: cadena hexadecimal a bytes] (https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes) –

Respuesta

13

AC es un poco sensible al caso de valores hexadecimales, cambiar a mayúsculas y debería funcionar

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 

salida:

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

así que realmente fue un error simple. gracias por señalar esto, funciona como un encanto. – fragman

+0

contento de ayudar, BC es una gran herramienta con algunos caprichos que solo debes saber :-) –

+0

¿Alguien sabe cómo rellenar la salida de bc a una cierta cantidad de dígitos? Esto no es necesario en el ejemplo anterior, pero simplemente pruebe el ciclo con un 00 como entrada. –

4

Aquí está la secuencia de comandos que utilizo:

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

Advertencias: Los números hexadecimales deben estar precedidos por '0x', y la columna ** HEX ** en realidad enumera los valores decimales. Pero gracias por ofrecer una solución pura bash a una pregunta "Cómo ... en bash"! A veces eso es realmente lo que la gente está buscando. No siempre se puede depender de la presencia de herramientas como bc. –

+0

la versión de bash que estoy usando ('4.4.12') no necesita ponerle un prefijo a los números hexadecimales. Sin embargo, el script no maneja '0' correctamente, quiere reemplazar' $ Binary' con '$ {Binary: -0}' en la última llamada 'echo' – untore

Cuestiones relacionadas