Dans Bash, comment fait-on une conversion de base de décimal en une autre base, en particulier hexadécimale. Il semble facile d'aller dans l'autre sens:
$ echo $((16#55))
85
Avec une recherche sur le Web, j'ai trouvé un script qui fait le calcul et la manipulation des caractères pour effectuer la conversion, et je pourrais l'utiliser comme fonction, mais j'aurais pensé que bash aurait déjà une conversion de base intégrée - le fait-il?
bash
shell
text-processing
hex
Dave Rove
la source
la source
Réponses:
Avec
bash
(ou n'importe quel shell, à condition que laprintf
commande soit disponible (une commande POSIX standard souvent construite dans les shells)):Avec
zsh
, vous pouvez aussi faire:Cela fonctionne pour les bases de 2 à 36 (avec une
0-9a-z
casse insensible aux chiffres).Avec
ksh93
, vous pouvez utiliser:Ce qui fonctionne pour les bases de 2 à 64 (avec
0-9a-zA-Z@_
comme chiffres).Avec
ksh
etzsh
, il y a aussi:Bien que cela soit limité aux bases jusqu'à 36 en ksh88, zsh et pdksh et 64 en ksh93.
Notez que tous ceux-ci sont limités à la taille des
long
entiers sur votre système (int
avec certains shells). Pour quelque chose de plus grand, vous pouvez utiliserbc
oudc
.Avec des bases prises en charge allant de 2 à un certain nombre requis par POSIX pour être au moins aussi élevé que 99. Pour les bases supérieures à 16, les chiffres supérieurs à 9 sont représentés sous la forme de nombres décimaux séparés par des espaces et 0.
Ou même avec
dc
(bc
utilisé pour être (et est toujours sur certains systèmes) un wrapperdc
):la source
#
?bash
intégrées, vous pouvez entrer des nombres dans n'importe quelle base, mais pas en sortie dans une base autre que 8, 10 et 16. Pour d'autres bases, vous auriez besoin d'un autre shell commezsh
ouksh
ou usebc/dc
.alias hex="printf '%x\n'"
Utilisez printf:
Pour affecter la valeur à une variable, utilisez la substitution de commande:
la source
-v
option pour le printf intégré:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) n'est pas nécessaire ici; Je l'éviterais.-v
éviterait la fourche et le tuyau (en bash, pas ksh93 qui ne bifurquerait pas ici comme ilprintf
est intégré). Notez que ce$((16#55))
n'est pas standard non plus.x=$(some_builtin)
?Utilisez la substitution d'expansion arithmétique intégrée présente dans tous les shells compatibles POSIX - qui est à peu près universelle de nos jours.
et
ATTENTION: en particulier dans le dernier exemple, l'expansion peut entraîner des résultats inattendus - les chiffres hexadécimaux dans la variable «hex» doivent former une constante hexadécimale légale, sinon des messages d'erreur potentiellement obscurs se produisent. Par exemple, si «hex» était «0xdead», l'expansion arithmétique deviendrait 0x0xdead, ce qui n'est pas interprétable comme une constante. Bien sûr, dans ce cas, l'expansion arithmétique $ (($ hex)) ferait l'affaire. Il est laissé comme exercice au lecteur de créer la correspondance de modèle de traitement de sous-chaîne simple qui supprimerait un préfixe «0x» facultatif.
la source
Vous pouvez utiliser la bibliothèque awk Velour :
Ou:
la source