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
ibase
undobase
bei Stackoverflow: http://stackoverflow.com/questions/9889839/bc-and-its-ibase-obase-options