¿Alguien puede ayudarme a convertir un número hexadecimal a un número decimal en un script de shell?
Por ejemplo, quiero convertir el número hexadecimal bfca3000
a decimal usando un script de shell. Básicamente quiero la diferencia de dos números hexadecimales.
Mi código es:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
Al ejecutar, me sale este error:
Line 48: -: syntax error: operand expected (error token is "-")
Respuestas:
Para convertir de hexadecimal a decimal, hay muchas formas de hacerlo en el shell o con un programa externo:
Con intento:
con antes de Cristo:
con perl:
con printf :
con pitón:
con rubí:
con node.js:
con rinoceronte:
con maravilloso:
fuente
printf
solución es POSIX? Si es así, es el mejor :)$((0xff))
, es decir, con prefijo hexadecimal tipo C en lugar de16#
, aunqueN#
es claramente más general.echo $((077E9F2DBF49D100001#FF))
desborda el límite de enteros de 64 bits de 2 ^ 64.bc
maneja esto correctamente.Tratar con una versión incrustada muy ligera de busybox en Linux significa que muchos de los comandos tradicionales no están disponibles (bc, printf, dc, perl, python)
Gracias a Peter Leung por esta solución.
fuente
echo $((0x077E9F2DBF49D100001))
desborda el límite de entero de 64 bits de 2 ^ 64.bc
maneja esto correctamenteUna forma más de hacerlo usando el shell (bash o ksh, no funciona con el tablero):
fuente
#
símbolo? ¿Hay alguna otra aplicación o documentación para leer más sobre su uso?Hay varias herramientas disponibles desde dentro de un shell. Sputnick le ha dado una excelente visión general de sus opciones, en función de su pregunta inicial. Definitivamente merece votos por el tiempo que pasó dándole múltiples respuestas correctas.
Uno más que no está en su lista:
Pero si todo lo que quiere hacer es restar, ¿por qué molestarse en cambiar la entrada a la base 10?
El
dc
comando es "desk calc". También tomará información de stdin, comobc
, pero en lugar de usar el "orden de operaciones", usa la notación de apilamiento ("polaco inverso"). Le das entradas que agrega a una pila, luego le das operadores que sacan elementos de la pila y retroceden en los resultados.En los comandos anteriores tenemos lo siguiente:
16i
- le dice a dc que acepte la entrada en la base 16 (hexadecimal). No cambia la base de salida.BFCA3000
- su número inicial17FF
- un número hexadecimal aleatorio que elegí para restar de tu número inicial-
- tome los dos números que hemos empujado, reste el último del anterior, luego vuelva a colocar el resultado en la pilap
- Imprime el último elemento en la pila. Esto no cambia la pila, así que ...10o
- le dice a dc que imprima su salida en la base "10", pero recuerde que nuestro esquema de numeración de entrada es actualmente hexadecimal, por lo que "10" significa "16".p
- imprime el último elemento en la pila de nuevo ... esta vez en hexadecimal.Puedes construir soluciones matemáticas fabulosamente complejas con dc. Es bueno tener en su caja de herramientas para los scripts de shell.
fuente
El error como se informa aparece cuando las variables son nulas (o vacías):
Eso podría suceder porque el valor dado a bc era incorrecto. Bien podría ser que bc necesita valores MAYÚSCULAS. Necesita
BFCA3000
, nobfca3000
. Eso se arregla fácilmente en bash, solo usa la^^
expansión:Eso cambiará el guión a esto:
Pero no hay necesidad de usar bc [1], ya que bash podría realizar la traducción y sustracción directamente:
[1] Nota: Supongo que los valores podrían representarse en matemáticas de 64 bits, ya que la diferencia se calculó en bash en su script original. Bash está limitado a enteros menores que ((2 ** 63) -1) si se compila en 64 bits. Esa será la única diferencia con bc que no tiene ese límite.
fuente
En el tablero y otros proyectiles, puede usar
para convertir un número hexadecimal a decimal. Esto no es bash, o ksh, específico.
fuente
printf "%d" 0xff