159 votes

Hexadécimal vers décimal en Shell script

Quelqu'un peut-il m'aider à convertir un nombre hexadécimal en nombre décimal dans un shell script ?

Par exemple, je veux convertir le nombre hexadécimal bfca3000 en décimal en utilisant un shell script. Je veux essentiellement la différence de 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, j'obtiens cette erreur :

Line 48: -: syntax error: operand expected (error token is "-")

391voto

sputnick Points 31663

Pour convertir un hexagone en décimal, il existe de nombreuses façons de le faire dans le shell ou avec un programme externe :

Avec bash :

$ 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 rubis :

$ ruby -e 'p "FF".to_i(16)'
255

avec node.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

51voto

hinekyle Points 752

L'utilisation d'une version embarquée très légère de busybox sous Linux signifie que de nombreuses 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.

16voto

Tomás Fox Points 368

Une autre façon de le faire en utilisant le shell (bash ou ksh, ne fonctionne pas avec dash) :

echo $((16#FF))
255

13voto

ghoti Points 14996

Divers outils sont à votre disposition à l'intérieur d'un shell. Sputnick vous a donné un excellent aperçu de vos options, sur la base de votre question initiale. Il mérite certainement des votes pour le temps qu'il a passé à vous donner plusieurs bonnes réponses.

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 en base 10 ?

[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$ 

El dc est "desk calc". Il prendra également les entrées de stdin, comme bc mais au lieu d'utiliser l'"ordre des opérations", il utilise la notation par empilement ("polonaise inversée"). Vous lui donnez des entrées qu'il ajoute à une pile, puis des opérateurs qui retirent des éléments de la pile et repoussent les résultats.

Dans les commandes ci-dessus, nous avons obtenu ce qui suit :

  • 16i -- indique à dc d'accepter les entrées en base 16 (hexadécimale). Ne change pas la base de sortie.
  • BFCA3000 -- votre numéro initial
  • 17FF -- un nombre hexagonal aléatoire que j'ai choisi de 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 -- imprime le dernier élément de la pile. Cela 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 d'entrée est actuellement hexadécimal, donc "10" signifie "16".
  • p -- imprime à nouveau le dernier élément de la pile ... cette fois en hexadécimal.

Vous pouvez construire des solutions mathématiques fabuleusement complexes avec dc. C'est une bonne chose à avoir dans votre boîte à outils pour les scripts.

7voto

novice Points 390

Dans les shells dash et autres, vous pouvez utiliser

printf "%d\n" (your hexadecimal number)

pour convertir un nombre hexadécimal en décimal. Ceci n'est pas spécifique à bash ou à ksh.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X