(Co-Admin)
Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
Delphi 11 Alexandria
|
Re: bräuchte mal unterstützung (Zahlensysteme)
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
|