Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Produkt Aktivierung

  Alt 23. Mai 2004, 12:57
Hi

Die hashs sind erstmal irrelevant für dich. Das was du suchst findest du im DEC unter Text-Formate. Diese Routinen wandeln einen Binären Wert zur Basis 2 in einen Textstring der aus Ziffern zu den Basen 16,32,64 usw. bestehen. Im Grunde handelt es sich dabei immer um eine Textkonvertierung mit Basiswechsel.

Nun, d.h. für dich das in deinem Beispiel die Zeichen '0'..'9', 'A'..'Z' ein Set aus 36 Ziffern darstellen. Dein Ziel ist es jetzt eine "Zahl" bestehend aus diesen "Ziffern" in eine andere Basis umzuwandeln, zb. Binär = Basis 2, Dezimal = Basis 10 oder Hexdezimal = Basis 16. Ich würe dir empfehlen zur Basis 2 umzuwandeln.

WIE macht man das ??

Wir haben einen String wie "0DK8Z-Y7MN-12GUO". Zuerst entfernen wir mal die Bindestriche und bekommen "0DK8ZY7MN12GUO". Jede "Ziffer" in diesem Text ist ein gemapptes Zeichen aus dem Charset ['0'..'9', 'A'..'Z'] entspräche also den Zahlen 0 bis 35. Um diesen Wert also in einen Int64 als binäre Zahle zu konvertieren müssen wir nur von Rechts nach Links den Text auswerten, die entsprechende "Ziffer" in deren Btragsmäßigen Wert um wandeln, also 0 bis 35, unseren Int64 mit 36 multiplizieren und den ermittelten Betrag addieren. Schlichtweg eben eine einfach Umwandlung einer Textformatierten Zahl in deren binärem Gegenstück. Wir machen also exakt das gleiche was zB. StrToInt() mit einem Deziamlen String macht.

Das könnte dann so aussehen:


Delphi-Quellcode:

const
  Chars : PChar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function ConvertToBin(const Value: String; Base: Byte = 36): Int64;
var
  I,J: Integer;
begin
  Result := 0;
  for I := Length(Value) downto 1 do
  begin
    J := Pos(Value[I], Chars);
    if (J > 0) and (J <= Base) then
      Result := Result * Base + (J -1);
  end;
end;

Nun fehlt noch der umgekehrte Schritt:

Delphi-Quellcode:
function ConvertToBase(Value: Int64; Base: Byte = 36): String;
begin
  Result := '';
  while Value > 0 do
  begin
    Result := Chars[Value mod Base] + Result;
    Value := Value div Base;
  end;
end;
Wie du oben erkennen solltest handelt es sich um einfachste Zahlenkonvertierungen.

Gruß Hagen
  Mit Zitat antworten Zitat