Hexadécimal À décimal en écriture Shell
quelqu'un Peut-il m'aider à raconter comment convertir un nombre hexadécimal en nombre décimal dans un script shell? Par exemple: Je veux convertir le nombre hexadécimal bfca3000
en décimal en utilisant un script shell. Je veux la différence entre deux nombres hexadécimaux. Mon code est:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
lors de l'exécution, je reçois l'erreur comme:
Line 48: -: syntax error: operand expected (error token is "-")
6 réponses
Pour convertir hex2dec, ce sont de nombreuses façons de le faire dans un shell ou un script :
Avec bash (méfiez-vous de les espaces en blanc):
$ echo $(( 16#FF ))
255
avec bc :
$ echo "ibase=16; FF" | bc
255
avec perl :
$ perl -le 'print hex("FF");'
255
avec printf :
$ printf "%d\n" 0xFF
255
avec python :
$ python -c 'print(int("FF", 16))'
255
avec ruby :
$ ruby<<EOF
p "FF".to_i(16).to_s(10)
EOF
"255"
avec noeud.js :
$ nodejs <<< "console.log(parseInt('FF', 16))"
255
avec rhino :
$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255
avec groovy :
$ groovy -e 'println Integer.parseInt("FF",16)'
255
traitant d'une version embarquée Très légère de busybox sur Linux signifie que beaucoup de commandes traditionnelles ne sont pas disponibles (bc, printf, dc, perl, python)
echo $((0x2f))
47
hexNum=2f
echo $((0x${hexNum}))
47
Crédit Peter Leung pour cette solution.
une autre façon de le faire en utilisant le shell (bash ou ksh, ne fonctionne pas avec dash):
echo $((16#FF))
255
divers outils sont disponibles à l'intérieur d'un shell. Sputnick vous a donné un excellent aperçu de vos options, selon votre question initiale. Il mérite certainement des votes pour le temps qu'il a passé à vous donner plusieurs réponses correctes.
un de plus qui n'est pas sur sa liste:
[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816
mais si tout ce que vous voulez faire est de soustraire, pourquoi prendre la peine de changer l'entrée à la base 10?
[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$
le dc
commande "desk calc". Il prendra également des entrées de stdin, comme bc
, mais au lieu d'utiliser" ordre des opérations", il utilise la notation de gerbage ("reverse Polish"). Vous lui donnez des entrées qu'il ajoute à une pile, puis vous lui donnez des opérateurs qui sortent des articles de la pile, et vous repoussez les résultats.
dans les commandes ci-dessus nous avons ce qui suit:
-
16i
-- dit à dc d'accepter entrée en base 16 (hexadécimal). Ne change pas la base de sortie. -
BFCA3000
-- votre numéro initial -
17FF
-- un nombre hexadécimal que j'ai choisi au hasard pour soustraire de votre nombre initial -
-
-- prenez les deux nombres que nous avons poussés, et soustrayez le dernier du premier, puis repoussez le résultat sur la pile -
p
-- imprimez le dernier élément sur la pile. Ça ne change pas la pile, donc... -
10o
-- dit à dc d'imprimer sa sortie en base "10", mais rappelez-vous que notre schéma de numérotation des entrées est actuellement hexadécimal, donc" 10 "signifie"16". -
p
-- imprimez à nouveau le dernier article sur la pile ... ce moment dans l'hexagone.
vous pouvez construire des solutions mathématiques fabuleusement Complexes avec dc. C'est une bonne chose d'avoir dans votre boîte à outils pour les scripts shell.
l'erreur signalée apparaît lorsque les variables sont nulles (ou vides):
$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")
cela pourrait se produire parce que la valeur donnée à bc était incorrecte. Il se pourrait bien que la Colombie-Britannique ait besoin de valeurs en majuscules. Il faut BFCA3000
, pas bfca3000
. Qui est facilement fixé dans bash, il suffit d'utiliser le ^^
expansion:
var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`
qui va changer le script en ceci:
#!/bin/bash
var1="bfca3000"
var2="efca3250"
var3="$(echo "ibase=16; ${var1^^}" | bc)"
var4="$(echo "ibase=16; ${var2^^}" | bc)"
var5="$(($var4-$var3))"
echo "Diference $var5"
Mais il n'est pas nécessaire pour utilisez bc [1], car bash pourrait effectuer la traduction et la soustraction directement:
#!/bin/bash
var1="bfca3000"
var2="efca3250"
var5="$(( 16#$var2 - 16#$var1 ))"
echo "Diference $var5"
[1] Note: je suppose que les valeurs peuvent être représentées en 64 bits, comme la différence a été calculée en bash dans votre script original. Bash est limité aux entiers inférieurs à ((2**63)-1) s'ils sont compilés en 64 bits. Qui sera la seule différence avec la colombie-britannique qui n'a pas de limite.
Dans dash et autres shells, vous pouvez utiliser
printf "%d\n" (your hexadecimal number)
pour convertir un nombre hexadécimal en décimal. Ce n'est pas bash ou ksh, spécifique.