Cambiar un número de decimal a binario o hexadecimal y viceversa con bc
Si tenemos que cambiar un valor de sistema de numeración, nos podemos ayudar de bc, indicándole en la entrada el valor de «ibase», la base del número de entrada y «obase», la base del valor que queramos que nos devuelva. Por defecto, bc devuelve los resultados en decimal, por lo que si queremos convertir de cualquier otra base a decimal, no es necesario indicarle el parámetro «obase».
Convertir de decimal a binario
#!/bin/bash let decimal=3 binario=$(echo "ibase=10;obase=2;$decimal" | bc) echo $decimal en binario es $binario
Convertir de decimal a hexadecimal
#!/bin/bash let decimal=255 hexadecimal=$(echo "ibase=10;obase=16;$decimal" | bc) echo $decimal en hexadecimal es $hexadecimal
Convertir de binario a decimal
#!/bin/bash let binario=11 decimal=$(echo "ibase=2; $binario" | bc) echo El número binario $binario en decimal es $decimal
Convertir de hexadecimal a decimal
#!/bin/bash hexadecimal=FF decimal=$(echo "ibase=16; $hexadecimal" | bc) echo El número hexadecimal $hexadecimal en decimal es $decimal
Nótese que para aportar el valor hexadecimal a la variable, no he usado let, ya que FF no lo entendería como un valor numérico.
Convertir de binario a hexadecimal
#!/bin/bash hexadecimal=FF binario=$(echo "ibase=16;obase=2;$hexadecimal" | bc) echo El número hexadecimal $hexadecimal en binario es $binario
Convertir de hexadecimal a binario
Hasta ahora hemos visto que la conversión entre sistemas de numeración es simple y lógico. Pero no siempre es así. Por algún extraño motivo, si intentamos convertir directamente de hexadecimal a binario como hemos hecho el resto de conversiones:
#!/bin/bash let binario=1111 hexadecimal=$(echo "ibase=2;obase=16;$binario" | bc) echo El número binario $binario en hexadecimal es $hexadecimal
Nos devuelve esto:
El número binario 1111 en hexadecimal es 120
Y no sólo en este valor, sino en cualquier otro valor:
El número binario 11111111 en hexadecimal es 100110
A simple vista podemos ver que algo falla. No puede devolver ese resultado. Pero vamos a comprobar el fallo convirtiendo los dos valores a decimal y comprobando si son iguales:
#!/bin/bash let binario=11111111 hexadecimal=$(echo "ibase=2;obase=16;$binario" | bc) echo El número binario $binario en hexadecimal es $hexadecimal decimal=$(echo "ibase=2; $binario" | bc) decimal2=$(echo "ibase=16; $hexadecimal" | bc) echo $binario en decimal es $decimal echo $hexadecimal en decimal es $decimal2
Que nos devuelve:
El número binario 11111111 en hexadecimal es 100110 11111111 en decimal es 255 100110 en decimal es 1048848
Por lo que no hay duda de que algo falla. Así que debemos solucionarlo. Una opción puede ser convertir de binario a decimal y de decimal a hexadecimal:
#!/bin/bash let binario=11111111 decimal=$(echo "ibase=2; $binario" | bc) hexadecimal=$(echo "ibase=10;obase=16;$decimal" | bc) echo El número binario $binario en hexadecimal es $hexadecimal decimal=$(echo "ibase=2; $binario" | bc) decimal2=$(echo "ibase=16; $hexadecimal" | bc) echo $binario en decimal es $decimal echo $hexadecimal en decimal es $decimal2
Y, ahora sí, nos devuelve el resultado esperado:
El número binario 11111111 en hexadecimal es FF 11111111 en decimal es 255 FF en decimal es 255