Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: bräuchte mal unterstützung (Zahlensysteme)

  Alt 8. Mai 2007, 19:22
Moin Sharack,

ich bin jetzt zwar nicht marabu, aber ich versuche mal die Schleife zu kommentieren:

Delphi-Quellcode:
function HexToBin(const s: string): string;

const
  HexDigits = '0123456789ABCDEF';
  BinTetrade: array [0..15] of string[4]
    = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
       '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
  // iNibble, da ein halbe Byte (4-Bit) Nibble genannt wird
  i, iNibble: Integer;
begin
  SetLength(Result, Length(s) shl 2);
  for i := 1 to Length(s) do
  begin
    // Pos ermittelt ja die Position eines Zeichens in einem String
    // In diesem Falle wird es dazu benutzt die Position der hexadezimalen Ziffer
    // zu ermitteln.
    // Ist, z.b., im String ein C, so liefert Pos hier 12 zurück
    // Pred nimmt den Wert vor dem, den Pos zurückliefert (Predecessor = Vorgänger)
    // Man könnte hier auch
    // Pos(Upcase(s[i]), HexDigits)-1
    // schreiben.
    // Es muss 1 abgezogen werden, da iNibble den Index des Zeichens in BinTetrade
    // enthalten soll, da dieses Array bei 0 beginnt.
    iNibble := Pred(Pos(Upcase(s[i]), HexDigits));
    // Mit BinTetrade[iNibble][1] wird das erste Zeichen des über iNibble indizierten
    // Wertes adressiert. Die Angabe der [1] ist hier wichtig, da die Prozedur Move
    // für die ersten beiden Parameter keinen Typen vorsieht. Würde man [1] weglassen,
    // so würde man die Adresse von BinTetrade[iNibble] ansprechen, und nicht die
    // Stelle auf die die BinTetrade[iNibble] zeigt.
    // Bei Result[Succ(Pred(i) shl 2)] ist es ähnlich. Hier wird nur der Vorgänger von
    // i mal 4 genommen (einmal nach links schieben entspricht *2, zweimal *4, dreimal *8 usw.),
    // da ein String der BinTetrade die Länge von 4 hat. Zu diesem Ergebnis wird dann noch 1
    // addiert. (Succ => Successor).
    // Sinn des ganzen: Im Ergebnisstring werden, der Reihe nach die 1., 5., 9. ... Stelle angesprochen
    // und jeweils 4 Zeichen, eben der Wert des aktuell ermittelten Nibbles, kopiert.
    // Eine andere Schreibweise wäre: Result[((i-1)*4)+1]
    Move(BinTetrade[iNibble][1], Result[Succ(Pred(i) shl 2)], 4);
  end;
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat