Blogvorlage

http://seriousjr.43-1.org

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

 
© 2013 Dominik Zobel <dominik.zobel@tu-harburg.de>

Creative Commons BY License Die aufgelisteten Blogbeiträge und die dazugehörigen Dateien sind unter dieser Creative Commons BY 3.0 Lizenz ( Kurzform ) lizenziert.