AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

bräuchte mal unterstützung (Zahlensysteme)

Ein Thema von Sharack · begonnen am 8. Mai 2007 · letzter Beitrag vom 8. Mai 2007
 
Christian Seehase
(Co-Admin)

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

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

  Alt 8. Mai 2007, 18: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz