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 "-")
99
demandé sur VenkateshJN 2012-11-08 03:31:43

6 réponses

Pour convertir hex2dec, ce sont de nombreuses façons de le faire dans un shell ou un script :

Avec (méfiez-vous de les espaces en blanc):

$ echo $(( 16#FF ))
255

avec :

$ echo "ibase=16; FF" | bc
255

avec :

$ perl -le 'print hex("FF");'
255

avec :

$ printf "%d\n" 0xFF
255

avec :

$ python -c 'print(int("FF", 16))'
255

avec :

$ ruby<<EOF
p "FF".to_i(16).to_s(10)
EOF
"255"

avec :

$ nodejs <<< "console.log(parseInt('FF', 16))"
255

avec :

$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255

avec :

$ groovy -e 'println Integer.parseInt("FF",16)'
255
229
répondu Gilles Quenot 2018-05-24 13:14:58

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.

32
répondu hinekyle 2014-04-04 12:48:47

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

echo $((16#FF))
255
12
répondu Tomás Fox 2013-05-14 07:26:49

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.

11
répondu ghoti 2012-11-08 00:21:01

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.

3
répondu 2015-08-29 22:34:54

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.

1
répondu novice 2015-11-12 21:36:35