Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi: Unicode <-> Ansi + Algorithmus für Seriennummer (https://www.delphipraxis.net/38553-delphi-unicode-ansi-algorithmus-fuer-seriennummer.html)

c.wuensch 20. Jan 2005 20:38


Delphi: Unicode <-> Ansi + Algorithmus für Seriennumme
 
Hallo zusammen,

ich habe ein großes Problem mit Delphi und kann leider nirgendwo im Internet eine passende Antwort finden:

Ich möchte einen String beliebiger Länge in eine Zahlenkette umwandeln, und daraus dann über einen Algorithmus eine Seriennummer erzeugen. Am besten soll diese auch noch umkehrbar sein!

Problem 1:
Der String wird als Unicode übergeben, der Befehl Ord() funktioniert also nicht. Wie kriege ich diesen String denn nur ins ANSI-Format umgewandelt???

Problem 2:
Kennt jemand einen (wenn möglich umkehrbaren) Algorithmus, der aus beliebig vielen Zeichen immer eine Zahlenfolge mit einer festen Zeichenanzahl erzeugt?

Ich würde mich echt freuen, wenn mir jemand helfen könnte!

Cu, chris

mirage228 20. Jan 2005 20:48

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Hi,

wenn der WideString ANSI Zeichen enthält könntest Du einfach nach string casten, also z.B.
Delphi-Quellcode:
var
  WS: WideString;
  S: string;
begin
  WS := 'wide string';
  S := string(WS); // obwohl der Delphi Compiler Dir auch S := WS; durchgehen lässt, aber bei Ord könntest Du so casten
end;
Bei Deinem 2. Problem kann ich Dir leider nicht weiterhelfen :-(

Sharky 20. Jan 2005 21:27

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Zitat:

Zitat von c.wuensch
...Problem 2:
Kennt jemand einen (wenn möglich umkehrbaren) Algorithmus, der aus beliebig vielen Zeichen immer eine Zahlenfolge mit einer festen Zeichenanzahl erzeugt?....

Das dürfte schwer gehen. Wenn Ich dir 30 Zeichen übergebe und deine "Zahlenfolge" nur 15 Zeichen lang ist hast Du Informationen verloren. Eine Umkehrung geht also nicht. Ich würde aus dem Text einfach einen (MD5)-Hash erstellen und im Programm prüfen ob der Hash zu dem Text passt den der Anwender eingegeben hat.

c.wuensch 20. Jan 2005 22:09

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Hi ihr beiden,

vielen Dank für eure Mühe!

@mirage228:
Unglaublich, auf das Einfachste kommt man einfach nicht :wall:

Ich hatte es inzwischen so probiert:
Ansi := WideCharToString (pWideChar(Unicode));


@Sharky:
Ein MD5-Hash ist leider zu lang. Aber vielleicht könnte ich einen ähnlichen (vereinfachten) Algorithmus verwenden.
Hast du eine Ahnung, wie so ein MD5-Hash aufgebaut ist???

Cu, chris

Nikolas 20. Jan 2005 22:19

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Wie schon gesagt, ist eine solche umkehrbare Funktion unmöglich. Eine Alternative zum MD5 wäre ein Algorithmus wie der, der die Prüfziffer bei ISBN-Nummern liefert. Den solltest du so erweitern können, dass du mehr als eine Ziffer als Prüfsumme hast.
Bei der ISBN-Prüfnummer läuft das Verfahren so ab, dass du die erste Ziffer mit 1 multiplizierst, die zweite mit 3,.. und die n-te mit n und diese Werte addierst. Danach ermittelst du den Abstand zur nächsten durch 10 teilbare Zahl. Dieser Abstand ist dann die Prüfnummer.
Bsp:
12321 -> 1*1+2*2+3*3+2*4+1*5= 26 -> Prüfnummer ist 30-26=4.
// So müsste es eigentlich gewesen sein, war mal Klausuraufgabe, aber ich bin mir nicht mehr hindertprozentig sicher.

Wenn du jetzt die Faktoren änderst, oder in der anderen Richtung zählst, solltest du damit ein halbwegs brauchbares Ergebniss erhalten können.

c.wuensch 20. Jan 2005 23:47

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Super Idee, vielen Dank!

Das werde ich gleich morgen mal probieren.

Cu, chris

Bernhard Geyer 21. Jan 2005 07:26

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Zitat:

Zitat von c.wuensch
Problem 1:
Der String wird als Unicode übergeben, der Befehl Ord() funktioniert also nicht. Wie kriege ich diesen String denn nur ins ANSI-Format umgewandelt???

Wenn der String als Unicode-String rüberkommt wird er sicherlich auch Sonderzeichen, welche nicht in der Westlichen Codepage vorhanden sind. Deshalb mußt Du eine WideString -> String-Wandlung durchführen, welche umkehrbar ist. Dafür biedet sich UTF8 an. In der Unit System.pas gibt es dazu die Funktionen UTF8Encode/UTF8Decode.

Sharky 21. Jan 2005 07:58

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Zitat:

Zitat von c.wuensch
....Ein MD5-Hash ist leider zu lang. ...

Hai Chris,

Du könntest ja einfach nur einen Teil des Hashwertes für die SN verwenden (dadurch wird es natürlich "unsicherer").

z.B.:
Code:
String        = Sharky der Haifisch
MD5-Hash      = 938C-0D1D-2F14-7EA4-68E7-7D37-F97D-BD49  (ohne die "-" )
Ein Teil davon = 938C-2F14-68E7-F97D

c.wuensch 21. Jan 2005 18:35

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
@Bernhard Geyer:

Verarbeitet denn die Funktion WideCharToString oder der Typecast mit String(WideString) die Sonderzeichen nicht korrekt?

@Sharky:

Auch eine sehr gute Idee! Nur, wie kann man mit Delphi einen MD5-Hash erzeugen?

Cu, Chris

Urmel 22. Jan 2005 08:55

Re: Delphi: Unicode <-> Ansi + Algorithmus für Serienn
 
Zitat:

Zitat von c.wuensch
@Sharky:

Auch eine sehr gute Idee! Nur, wie kann man mit Delphi einen MD5-Hash erzeugen?

Cu, Chris

Ich glaube da ist etwas in der Code-Library bei den Algorithmen. klick


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz