{  Joachim Deckers  Anlage zur 2. Staatsexamensarbeit / 28.5.96  Diese Unit wird für Aufgabe 7 benötigt ("7.3.5.3 Exkurs: Hamming-Codes")  Sie stellt eine Testprozedur für die Kodierung/Dekodierung zur Verfügung.}unit bitstr;INTERFACE  {$F+} { FAR-Aufrufe erzwingen }  type kodierungsfunktion = function(s: string): string;       Pkodierungsfunktion= ^kodierungsfunktion;  function string2bitstring(s: string): string;    { Wandelt einen String in einen Bitstring, d. h. einen      String aus den Zeichen '0' und '1', um, der die Bitfolge      von s darstellt. }   function bitstring2string(s: string): string;    { Wandelt einen Bitstring in den String um,      dessen Bitfolge er repräsentiert. }        procedure teste(kodiere, dekodiere: kodierungsfunktion; fehlersim: boolean);  const fehlerrate = 2e-2;  var   fehler     : integer;IMPLEMENTATION  procedure verfaelsche(var s: string);  var i: integer;  begin    randomize;    fehler:=0;    for i:=1 to length(s) do      if random<fehlerrate then begin        s[i] := char(ord('0')+abs(ord(s[i])-ord('0')-1));        inc(fehler)      end  end;  function string2bitstring(s: string): string;  type string8 = string[8];  var i: integer;      a: string;      function char2bitstring(c: char): string8;      var i : integer;          bs: string8;      begin        bs:='';        for i:=1 to 8 do begin          bs := char (ord('0') + (byte(c) and 1)) + bs;          c  := char(byte(c) shr 1)        end;        char2bitstring := bs      end;  begin    a:='';    if length(s)>64 then      Writeln('Die Länge des Strings für string2bitstring darf 64 nicht überschreiten!')    else      for i:=1 to Length(s) do        a:=a+char2bitstring(s[i]);    string2bitstring:=a  end;  function bitstring2string(s: string): string;  type string1 = string[1];  var i: integer;      a: string;    function bitstring2char(bs: string): char;    var i: integer;        b: byte;    begin      b:=0;      for i:=1 to 8 do        b:=2*b + ord(bs[i])-ord('0');      bitstring2char := char(b)    end;  begin    a:='';    if (length(s) mod 8)<>0 then      Writeln('Die Länge des Strings für bitstring2string muß ein Vielfaches von 8 sein!')    else      for i:=1 to length(s) div 8 do        a:=a+bitstring2char(Copy(s,(i-1)*8+1,8));    bitstring2string := a  end;  procedure teste;  var     zeile,          bs_ascii,          bs_code,          bs_ocode,          bs_decode,          bs_decodeascii : string;          i              : integer;  begin    writeln;    writeln('Testroutine für die Funktionen kodiere und dekodiere');    writeln;    write('Bitte geben Sie einen Text ein: ');    readln(zeile);    if Length(zeile)>12 then begin      Writeln('Zeile zu lang für diesen Test, schneide ab zu: ');      zeile[0]:=#12;      Writeln(zeile)    end;    writeln('Die Bitfolge dieses Textes im ASCII-Code ist');    bs_ascii:=string2bitstring(zeile);    writeln(bs_ascii);    writeln('Die Bitfolge dieses Textes im Beispielcode ist');    bs_code:=kodiere(bs_ascii);    writeln(bs_code);    if fehlersim then begin      bs_ocode:=bs_code;      verfaelsche(bs_code);      Writeln('Code nach Simulierung einer gestörten Übertragung (',fehler,' Fehler):');      Writeln(bs_code)    end;    writeln('Dekodiert ergibt sich');    bs_decode:=dekodiere(bs_code);    writeln(bs_decode);    writeln('Als Text bedeutet dieses');    bs_decodeascii:=bitstring2string(bs_decode);    writeln(bs_decodeascii);    writeln;    if fehlersim and (fehler>0) then       if bs_decodeascii=zeile then        Writeln('Alle ',fehler,' Fehler wurden korrigiert.')      else begin        Writeln('Es wurden nicht alle ',fehler,' Fehler korrigiert!!!');        for i:=1 to length(zeile) do          if zeile[i]<>bs_decodeascii[i] then            Writeln('Eingabe[',i,'] = ',zeile[i],' (',Copy(bs_code,(i-1)*20+1,20),'),'#13,                    'Ausgabe[',i,'] = ',bs_decodeascii[i],' (',Copy(bs_ocode,(i-1)*20+1,20),'),');      end  end;beginend.
