Einführung

Ich muss oft Zahlen von einem Zahlensystem in ein anderes umwandeln. Für kleine Zahlen und bekannte Basen geht das noch im Kopf, aber wenn man viele oder grosse Zahlen umwandeln will, nimmt man gerne die Hilfe eines Computers entgegen. Damit ich nicht auf eine Internetverbindung und ein Onlinetool angewiesen bin, entwickelte ich ein kleines Script, welches Zahlensysteme für mich umwandelt.

Zahlensysteme umrechnen mit bc

Mit bc kann man ganz einfach Zahlensysteme umrechnen. Das kleine Tool bc ist bei allen gängigen Linux Distributionen installiert. Mit ibase gibt man das Input-Zahlensystem und mit obase das Output-Zahlensystem an. Auf der Konsole sieht das so aus:

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
obase=16
ibase=2
1111
F
^D

Die Befehle obase und ibase akzeptieren Werte zwischen 2 und 16. Die Buchstaben aus Zahlensystemen müssen als Grossbuchstaben geschrieben werden, da Kleinbuchstagen in bc als Variabeln interpretiert werden. Wichtig ist, dass man zuerst obase und erst dann ibase definiert, da sonst obase mit dem Zahlensystem von ibase ausgedrückt wird, was man eigentlich nicht will. Mit Ctrl-D kann bc beendet werden.

Die Befehle kann man mittels <<< direkt an bc schicken:

$ bc <<< "obase=16; ibase=2; 1111"
F

Script für die Umwandlung von Zahlensystemen

Folgendes Script macht einem das Leben noch etwas einfacher, da es einfacher aufgerufen werden kann und die Eingaben überprüft werden:

#!/usr/bin/env bash
########################################################################  
#  
# baseconv  
# Convert numbers from one base to another  
#  
########################################################################

########################################################################  
# Variables  
FROM=10  
TO=10

########################################################################  
# Functions  
PrintUsage() {  
 cho “Convert numbers from one base to another

Usage:  
baseconv from to number”  
}

########################################################################  
# Main

# Check Arguments  
if [ “$#” -ne “3” ]  
then  
  echo “You need to enter 3 numbers.”  
  PrintUsage  
  exit 1  
else  
  IBASE=${1^^}# ^^ = Uppercase  
  OBASE=${2^^}  NUMBER=${3^^}fi

if ! [[ “$IBASE” =~ ^[0-9A-F]+$ ]]  
then  
  echo “Input Base is not a number.”  
  PrintUsage  
  exit 1  
elif ! [[ “$OBASE” =~ ^[0-9A-F]+$ ]]  
then  
  echo “Output Base is not a number.”  
  PrintUsage  
exit 1  
elif ! [[ “$NUMBER” =~ ^[.0-9A-F]+$ ]]  
then  
  echo “Input Number is not a number.”  
  PrintUsage  
exit 1  
fi

# Let’s convert!  
bc <<< “obase=$OBASE; ibase=$IBASE; $NUMBER”

# EOF

Shell-Funktion

Alternativ kann man sich auch eine neue Funktion in der ~/.bashrc eintragen:

baseconv () 
{ 
    bc <<< "obase=${2^^}; ibase=${1^^}; ${3^^}"
}

Beispiele

Das Script bzw. die Shell-Funktion wird wie folgt benutzt:

Usage:
baseconv from to number

Zuerst das Input-Zahlensystem, dann das Output-Zahlensystem und dann die zu konvertierende Zahl.

Umwandlung von Hexadezimal zu Binär:

$ baseconv 16 2 F
1111

Umwandlung von Binär zu Dezimal:

$ baseconv 2 10 1111
15