Kévin Subileau

Espace personnel

binary

Linux/Unix - Conversion de bases en ligne de commande

Saviez-vous qu'il est possible de convertir des nombres de bases en bases en ligne de commande ? Et pas seulement du décimal au binaire !

Il vous suffit pour cela d'utiliser la génialissime commande bc. Il s'agit d'un petit outil, présent sur la plupart des systèmes Linux/Unix, qui permet d'effectuer des calculs en tout genre en ligne de commande. L'avantage est que vous pouvez facilement intégrer cette commande dans un script, comme toute autre commande, et ainsi effectuer de nombreux calculs à la suite ou convertir des nombres issus d'une autre commande par exemple.

Assez de suspens, passons aux choses sérieuses ! Pour faire simple, je vous propose d'étudier ces quelques exemples (le $ symbolise le prompt du shell) :

Conversion du nombre 42 du décimal au binaire :

$ echo 'obase=2;42' | bc
101010

N'est-ce pas un joli nombre ?! Plus sérieusement, on utilise la commande echo pour envoyer les ordres de calcul à bc via un pipe.

Ces ordres consistent à spécifier la base de sortie (obase, pour output base), ici en binaire donc base 2, puis à donner le nombre que l'on souhaite convertir. Les ordres sont séparés par des points-virgules, ou des retours à la ligne (dans le cadre d'un script ou de la lecture des ordres depuis un fichier avec cat par exemple).

Conversion du nombre 101010 du binaire au décimal :

$ echo 'ibase=2;101010' | bc
42

Pour effectuer l'opération inverse à la précédente, il suffit de remplacer obase par ibase pour spécifier cette fois ci la base d'entrée (input base), ainsi que le nombre à convertir bien évidemment.

Conversion du nombre 2A de l'hexadécimal au binaire :

$ echo 'ibase=16;obase=2;2A' | bc
101010

Remarquez qu'il est tout à fait possible de combiner les deux instructions ibase et obase pour convertir directement un nombre d'une base à une autre sans passer par le décimal. Je pense que vous avez maintenant compris le principe.

Bonus : Conversion de secondes en heures, minutes et secondes :

$ echo 'obase=60;7520' | bc
02 05 20

Le temps s'exprimant en base 60, il est assez simple de convertir des secondes en heures, minutes et secondes (ou minutes en heures et minutes). Il suffit de spécifier la base 60 en sortie, et de donner le nombre de secondes à convertir. Ici 7520 secondes équivaut à 2 heures, 5 minutes et 20 secondes.

Bc gère en entrée toutes les bases de 2 à 16 compris. En sortie, il n'y a presque pas de limite, tant qu'il s'agit d'une base valide (les bases -5 ou 1 sont un peu difficiles à manier ! Plus de précision dans le man ;) )

Bonus 2 : création de commandes raccourcies :

Je vous l'accorde, la base 23 n'est pas la plus courante. Si vous utilisez comme moi plus régulièrement les bases binaire, décimal, ou hexadécimal, vous avez sans doute envie d'avoir des commandes un peu plus courtes à taper. C'est possible simplement en ajoutant ces quelques lignes à votre fichier ~/.bashrc :

# Hexadécimal vers décimal
h2d(){
  echo "ibase=16; $@" | tr -s ' ' ';' | bc
}
# Décimal vers hexadécimal
d2h(){
  echo "obase=16; $@" | tr -s ' ' ';' | bc
}

# Binaire vers décimal
b2d(){
  echo "ibase=2; $@" | tr -s ' ' ';' | bc
}
# Décimal vers binaire
d2b(){
  echo "obase=2; $@" | tr -s ' ' ';' | bc
}

L'utilisation est ensuite très simple, il suffit de tapez le nom de la commande raccourcie suivi du nombre ou de la liste de nombres à convertir. Par exemple, pour convertir 101010 et 101011 du binaire au décimal :

$ b2d 101010 101011
42
43

Vous pouvez bien sûr changer le nom de ces commandes ou créer vos propres raccourcis en fonction des bases que vous utilisez le plus fréquemment.

Pour terminer, si vous souhaitez en savoir un peu plus sur bc, n'oubliez pas de consulter, comme toujours, son manuel (man bc). Vous pouvez également vous documenter sur Internet : cette page par exemple est plutôt bien détaillé.

Commentaire

Laisser un commentaire

ou

Champs Requis *.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>