Quelqu'un peut-il m'aider à convertir un nombre hexadécimal en nombre décimal dans un script shell?
Par exemple, je veux convertir le nombre hexadécimal en nombre bfca3000
décimal à l'aide d'un script shell. 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 "-")
Réponses:
Pour convertir hexadécimal en décimal, il existe de nombreuses façons de le faire dans le shell ou avec un programme externe:
Avec frapper:
avec avant JC:
avec perl:
avec printf :
avec python:
avec rubis:
avec node.js:
avec rhinocéros:
avec sensationnel:
la source
printf
solution est-elle POSIX? Si oui, c'est le meilleur :)$((0xff))
, c'est-à-dire avec un préfixe hexadécimal de type C au lieu de16#
, bien que ceN#
soit clairement plus général.echo $((077E9F2DBF49D100001#FF))
dépasse la limite d'entier 64 bits de 2 ^ 64.bc
gère cela correctement.Gérer une version intégré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)
Merci à Peter Leung pour cette solution.
la source
echo $((0x077E9F2DBF49D100001))
dépassement de la limite d'entiers 64 bits de 2 ^ 64.bc
gère cela correctementUne autre façon de le faire en utilisant le shell (bash ou ksh, ne fonctionne pas avec dash):
la source
#
symbole? Existe-t-il d'autres applications ou documentation pour en savoir plus sur son utilisation?Différents outils sont à votre disposition à partir d'un shell. Sputnick vous a donné un excellent aperçu de vos options, basé sur votre question initiale. Il mérite certainement des votes pour le temps qu'il a passé à vous donner plusieurs réponses correctes.
Un autre qui ne figure pas sur sa liste:
Mais si tout ce que vous voulez faire est de soustraire, pourquoi changer l'entrée en base 10?
La
dc
commande est "desk calc". Il prendra également les entrées de stdin, commebc
, mais au lieu d'utiliser "l'ordre des opérations", il utilise la notation d'empilement ("polonais inversé"). Vous lui donnez des entrées qu'il ajoute à une pile, puis lui donnez des opérateurs qui font sortir les éléments de la pile et repoussez les résultats.Dans les commandes ci-dessus, nous avons les éléments suivants:
16i
- dit à dc d'accepter l'entrée en base 16 (hexadécimal). Ne change pas la base de sortie.BFCA3000
- votre numéro initial17FF
- un nombre hexadécimal aléatoire que j'ai choisi pour soustraire de votre nombre initial-
- prenez les deux nombres que nous avons poussés, et soustrayez le dernier du précédent, puis repoussez le résultat dans la pilep
- imprimer le dernier élément de la pile. Cela ne change pas la pile, donc ...10o
- dit à dc d'afficher 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
- imprimer à 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 d'avoir dans votre boîte à outils pour les scripts shell.
la source
L'erreur telle que signalée apparaît lorsque les variables sont nulles (ou vides):
Cela peut se produire car la valeur donnée à bc est incorrecte. Cela pourrait bien être que bc a besoin de valeurs UPPERcase. Il en a besoin
BFCA3000
, nonbfca3000
. Cela est facilement corrigé dans bash, utilisez simplement l'^^
extension:Cela changera le script en ceci:
Mais il n'est pas nécessaire d'utiliser bc [1], car bash pourrait effectuer la traduction et la soustraction directement:
[1] Remarque: je suppose que les valeurs pourraient être représentées en mathématiques 64 bits, car la différence a été calculée en bash dans votre script d'origine. Bash est limité aux entiers inférieurs à ((2 ** 63) -1) s'il est compilé en 64 bits. Ce sera la seule différence avec bc qui n'a pas une telle limite.
la source
Dans le tableau de bord et autres coquilles, vous pouvez utiliser
pour convertir un nombre hexadécimal en nombre décimal. Ce n'est pas spécifique à bash ou ksh.
la source
printf "%d" 0xff