Realisierung mit Bash
Mit dem folgenden Skript ist es möglich,
entweder eine Ascii-Zeichenfolge einzugeben und sich die dazugehörige Binärzeichenkette ausgeben zu lassen,
oder umgekehrt.
Dabei wird immer zuerst die Eingabe einer Ascii-Zeichenkette erwartet (oder Enter zum Überspringen) und
anschließend eine Binärzeichenkette.
Quellcode: ascii-binary.sh
#!/bin/bash
# oct: 40 - 176
##### -------- Ascii zu Binär wandeln -------- #####
asciitobin() {
nummer=`printf '%x\n' "'$1"` # Die Ascii-Hex-Nummer
# des aktuellen Zeichens
decnum=""
bit=$globalbit
while [ ! -z "$nummer" ] ; do # umwandeln der Hex-Nummer
element=${nummer:0:1} # in eine Dezimalnummer
let bit=$bit/16
case $element in
a) let element=10*$bit
let decnum=$decnum+$element;;
b) let element=11*$bit
let decnum+=$element;;
c) let element=12*$bit
let decnum+=$element;;
d) let element=13*$bit
let decnum+=$element;;
e) let element=14*$bit
let decnum+=$element;;
f) let element=15*$bit
let decnum+=$element;;
*) let element=$element*$bit
let decnum+=$element;;
esac
nummer=${nummer:1}
done
binaer=""
bit=$globalbit
while [ $bit -ge 2 ] ; do # Schreibe die Binärzeichen
let bit=$bit/2 # aus der ermittelten
# Dezimalzahl
if [ $decnum -ge $bit ] ; then
binaer=${binaer}1
let decnum-=$bit
else
binaer=${binaer}0
fi
done
}
##### -------- Binär zu Ascii wandeln -------- #####
bintoascii() {
block=$1
bit=$globalbit
decnum=0
while [ ${#block} -ge 1 ] ; do # ermittle die
binaerzeichen=${block:0:1} # Dezimalzahl aus
let bit=$bit/2 # den Binärzeichen
if [ $binaerzeichen -eq 1 ] ; then
let decnum+=$bit
fi
block=${block:1}
done
# Dezimal -> Hex
let erstes_zeichen=$decnum/16
let zweites_zeichen=$decnum-$erstes_zeichen*16
case $erstes_zeichen in
15) erstes_zeichen=f;;
14) erstes_zeichen=e;;
13) erstes_zeichen=d;;
12) erstes_zeichen=c;;
11) erstes_zeichen=b;;
10) erstes_zeichen=a;;
*) ;;
esac
case $zweites_zeichen in
15) zweites_zeichen=f;;
14) zweites_zeichen=e;;
13) zweites_zeichen=d;;
12) zweites_zeichen=c;;
11) zweites_zeichen=b;;
10) zweites_zeichen=a;;
*) ;;
esac
nummer=${erstes_zeichen}${zweites_zeichen}
# Gebe das Zeichen zur
zeichen=`printf "%b\n" "\x$nummer"` # ermittelten Hexadezi-
} # malnummer aus
##### -------- Hauptroutine -------- #####
OLDIFS=$IFS
IFS='
'
globalbit=256 # 2^8 Möglichkeiten ->
# 8 Binärzeichen pro Zeichen
echo "Ascii -> Binär und umgekehrt"
echo "Geben Sie einen Ascii-Teststring ein:"
read asciistring
if [ -z "$asciistring" ] ; then
echo "Sie haben nichts eingegeben"
fi
while [ ! -z "$asciistring" ] ; do # Für jedes Zeichen des
asciitobin ${asciistring:0:1} # Ascii Strings soll die
echo -n $binaer # asciitobin Funktion auf-
asciistring=${asciistring:1} # gerufen werden, die $binaer
done # auf den gewünschten Binärcode
# setzt (der ausgegeben wird)
echo ""
echo "Und nun einen Binär-String:"
read binstring
if [ -z $binstring ] ; then # Bei der Eingabe des Binär-
echo "Sie haben nichts eingegeben" # strings sind mehrere
exit 0 # Prüfungen notwendig, weil
fi # der String nur aus 0 und 1
# bestehen darf
let laenge=${#binstring}%8 # Da jedes Zeichen durch
if [ $laenge -ne 0 ] ; then # 8 Binärzeichen dargestellt
echo "Ungültige String-Länge" # wird, muss die Gesamtzahl
exit 1 # entsprechend sein, weil
fi # in der bintoascii Funktion
# nicht überprüft wird, ob
tempbinstring=${binstring//1/} # der übergebene String das
tempbinstring=${tempbinstring//0/} # richtige Format hat
if [ ! -z $tempbinstring ] ; then
echo "Ungültige Zeichen enthalten"
exit 1
fi
while [ ! -z $binstring ] ; do # Jeder 8-Binärzeichen Block
bintoascii ${binstring:0:8} # wird übergeben und gewandelt
echo -n $zeichen
binstring=${binstring:8}
done
echo ""
IFS=$OLDIFS
exit 0