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
Links und weitere Informationen
- Problem mit
ibaseundobasebei Stackoverflow: http://stackoverflow.com/questions/9889839/bc-and-its-ibase-obase-options