Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   XOR Verknüpfung, wie? (https://www.delphipraxis.net/63677-xor-verknuepfung-wie.html)

DoktorD 21. Feb 2006 15:23


XOR Verknüpfung, wie?
 
Hi!!!

Ich schreibe zur Zeit meine Diplomarbeit und brauch dringend Eure Hilfe!!!
Ich studiere leider nicht Informatik, denn dann sollte ich das können. Habe leider nur
wenige Delphi Kenntnisse. Wäre schön wenn Ihr es mir so einfach wie möglich erklären könntet.

Zu meinem Problem:

Ich muss neben einer Hauptsoftware (kein Delphiprogramm o.ä.) ein zusätzliches Nebenprogramm schreiben, welches aus einer Seriennummer die Checksumme berechnet.

Beispiel:

Der Befehl: <STX>TT? mit Checksumme: <STX>TT? cs<EOT>

Hinter dem Fragezeichen wird noch ein Leerzeichen interpretiert und dann soll die Checksumme kommen (vorher natürlich berechnet)
Um die Checksumme zu ermitteln müssen alle einzelnen Zeichen ín ASCII (HEX) umgewandelt werden und XOR verknüpft werden:

dh.: 3C XOR 02 XOR 3E XOR 54 XOR 54 XOR 3F XOR 20 = 1F
< STX > T T ? Leerzeichen

Die Seriennummer kann natürlich verschieden lang sein.
Wichtig ist auch noch, dass die Seriennummer in einem TXT Dokument hinterlegt ist und beim Start des Programms ausgelesen werden muss. Wenn die Checksumme berechnet worden ist sollte dann in ein anderes Testdokument stehen

nach dem Beispiel: <STX>TT? 1F<EOT>


Wäre cool wenn das einer von Euch hinbekommen würde


Viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiieeelen Dank!!!!

Sharky 21. Feb 2006 15:31

Re: Ganz dringend!!! XOR Verknüpfung, wie??????
 
Hai DoktorD,

ändere bitte den Titel deines Threads!
Dringend ist hier eigentlich jede Frage. Und mit den vielen ! und ? wird keiner lust haben deinen Thread zu lesen.
Danke für dein Verständniss.

SirThornberry 21. Feb 2006 15:40

Re: Ganz dringend!!! XOR Verknüpfung, wie??????
 
wir machen hier für niemand die arbeit. Sag einfach an welcher Stelle du dort nicht weiter kommst und was du bereits selbst geschafft hast. Wenn du sagst wo du nicht weiter kommst helfen wir dir gern aber wir machen nicht die komplette arbeit für dich.

Klaus01 21. Feb 2006 15:55

Re: Ganz dringend!!! XOR Verknüpfung, wie??????
 
Warum vorher unbedingt in Hex umwandeln?

Ansonsten wirst Dir vielleicht dies hier weiterhelfen.

ord(Zeichen1) XOR ord(Zeichen2)

Grüße
Klaus

DoktorD 21. Feb 2006 19:36

Re: Ganz dringend!!! XOR Verknüpfung, wie??????
 
Sorry wenn das so rübergekommen ist.

Ich hab mein Programm jetzt soweit, dass ich einen String mit der Seriennummer habe

strSN:=123456 (Die Zahl, bzw. der String kann unterschiedlich lang sein)

wie bekomme ich denn jetzt hin, dass ich jede einzelne Ziffer in einen ASCII Code XOR verknüpfen kann.

31 xor 32 xor 33 xor 34 xor 35 xor 36 wäre dann = 7 (in HEX)

Hinweis: Ich brauche das alles in HEX

Habt Ihr dafür ne Lösung?

Christian Seehase 21. Feb 2006 19:50

Re: Ganz dringend!!! XOR Verknüpfung, wie??????
 
Moin DoktorD,

wenn ich das richtig verstanden habe, fehlen Dir nur noch die entsprechend Begriffe um das in Delphi umsetzen zu können:

Da es sich um eine unbekannte Länge handelt: For-Schleife begrenzt durch die Länge des Strings (length)
Die Zeichen erst einmal in ihren Zahlenwert umsetzen: ord
Umwandlung einer Ganzzahl in eine hexadezimale Ausgabe: IntToHex

BTW:
Wenn Du den Edit-Button in Deinem ersten Beitrag benutzt kannst Du den Titel des Threads ändern.

DoktorD 21. Feb 2006 20:00

Re: XOR Verknüpfung, wie?
 
Danke für deine Antwort. Ich weiß schon was du meinst, aber irgendwie habe ich probleme das umzusetzten

Hast du vielleicht ein Beispiel für die Schleife?

Ich muss ja irgendwie die Nummer aufspalten, d.h. aus der ganzen Ziffer einzelne machen und dann umwandeln

Was genau macht denn "ord"? Das was in der Hilfe steht verstehe ich nicht so wirklich

Christian Seehase 21. Feb 2006 20:05

Re: XOR Verknüpfung, wie?
 
Moin DoktorD,

Du kannst jedes Zeichen des Strings einzeln ansprechen.
Um mal bei Deinem Beispiel zu bleiben:

strSN[3]

spricht das dritte Zeichen an, und statt eines festen Wertes nimmst Du den Schleifenzähler der for-Schleife.
Mit

ord(strSN[3]) bekommst Du dann den Zahlenwert, den das Zeichen an der dritten Stelle repräsentiert.

DoktorD 21. Feb 2006 20:07

Re: XOR Verknüpfung, wie?
 
Cool Danke. Ich probiere es gleich mal aus

Klaus01 21. Feb 2006 20:42

Re: XOR Verknüpfung, wie?
 
Delphi-Quellcode:
function checksum(SNr:String):String;
  VAR
    i:Byte;
    dummy:Byte;
begin
  dummy:=ord(SNr[1] XOR ord (SNr[2]);

  for i:=3 to length(SNr) DO
    begin
      dummy:=dummy XOR ord(SNr[i]);
    end;

  result := IntToHex(dummy);
end;
ungetestet aber sollte so gehen.

Grüße
Klaus

DoktorD 21. Feb 2006 21:16

Re: XOR Verknüpfung, wie?
 
Also ich bin nun fast fertig. Nur die Ergebnisse hauen noch nicht so hin

wieso kann ich denn nicht
Delphi-Quellcode:
 
  vString:=GetString();
  strSN:=GrobPath1(vString);
  intSN:=StrToInt(strSN);
  Ergebnis:= IntToHex(ord(intSN[1]),2) xor IntToHex(ord(intSN[2]),2)....
  WriteString();
  Checksum:=IntToHex(Ergebnis,2);
Wieso bringt der da einen Fehler? Irgendsoetwas mir Array.

Wichtig ist, dass ich den die Zahl(123456) die ja ein String ist in die einzelnen Ziffern aufteilt und dann diese einzelnen Ziffern in einen Hexwert(Ascii) umwandelt und dann xor verknüpfe.

Habt Ihr da ne Lösung?

DoktorD 21. Feb 2006 21:17

Re: XOR Verknüpfung, wie?
 
Danke Klaus!

DoktorD 21. Feb 2006 21:26

Re: XOR Verknüpfung, wie?
 
Bei

result := IntToHex(dummy);

zeigt er den Fehler

"Es gibt keine überladene Funktion von IntToHex, die man mit diesen Argumenten aufrufen kann"

Was bedeutet das? Geht das garnicht?

SirThornberry 21. Feb 2006 21:47

Re: XOR Verknüpfung, wie?
 
das bedeutet das deine parameterliste nicht mit der übereinstimmt die erwartet wird (du übergibst einen parameter zu wenig)

Klaus01 22. Feb 2006 06:13

Re: XOR Verknüpfung, wie?
 
uups
Delphi-Quellcode:
  result := IntToHex(dummy,2);
ein Byte liefert zwei Digits zurück.

Grüße
Klaus

DoktorD 22. Feb 2006 06:14

Re: XOR Verknüpfung, wie?
 
OK. Probiere es nochmal. Dank Dir!!!

DoktorD 22. Feb 2006 07:00

Re: XOR Verknüpfung, wie?
 
Vielen Dank Klaus01. Das mit der Seriennummer klappt schon.

Aber die Seriennummer alleine ergibt nicht alleine die Checksumme.

Die komplette Checksumme wird aus

<STX>OWE_509_Seriennummer_ _ steht für Leerzeichen (in Hex=20)

HEX
O = 4F
W = 57
E = 45
_ = 20
5 = 35
0 = 30
9 = 39
_ = 20
Seriennummer
_ = 20


Das OWE_509_ bleibt ja immer gleich. Aber wie kann ich das in diese Schleife mit einbringen? Oder gibts da ne andere Möglichkeit?

Danke für alles!

Sharky 22. Feb 2006 07:05

Re: XOR Verknüpfung, wie?
 
Zitat:

Zitat von DoktorD
.... Das OWE_509_ bleibt ja immer gleich. Aber wie kann ich das in diese Schleife mit einbringen? ...

Hai DoktorD,

entweder übergiebst Du das "OWE 509 " immer mit an die Funktion oder Du baust es dort einfach ein:
Delphi-Quellcode:
function checksum(SNr:String):String;
VAR
  i:Byte;
  dummy:Byte;
begin
  SNr := 'OWE 509 ' + SNr; // OWE__509_ wird vor jede Seriennummer gesetzt.
  dummy:=ord(SNr[1] XOR ord (SNr[2]);
  for i:=3 to length(SNr) DO
    begin
      dummy:=dummy XOR ord(SNr[i]);
    end;
  result := IntToHex(dummy);
end;

alzaimar 22. Feb 2006 07:07

Re: XOR Verknüpfung, wie?
 
Die Routine von Klaus versagt bei Strings mit einer Länge von weniger als 2 Zeichen:
Delphi-Quellcode:
Function CheckSum (Const aString : String) : String;
Var
  i : Integer;
 
Begin
  If Length (aString)=0 Then
    r := 0
  Else Begin
    r := Ord (aString[1]);
    For i:=2 To Length (aString) Do
      r := r xor Ord (aString[i]);
    End;
  Result := IntToHex (r,2);
End;
Auch wenn der Fall bei Dir vielleicht nicht auftritt, irgendwann willst du die Routine vielleicht nochmal verwenden, und spätestens dann hast Du vergessen, das sie nicht uneingeschränkt funktioniert.

Ich implementiere solche Basisfunktionen immer so, das sie immer zu einem Ergebnis führen. Dann bin ich auf der sicheren Seite und ich habe mindestens einen Fehler weniger :zwinker:

@Klaus01: Übergebe einfach das gesamte Telegram (ab dem <STX>), dann wird doch auch die komplette checksum gebildet.

Bist du Dir Sicher, das Du die Checksumme in Hex brauchst?

Sharky 22. Feb 2006 07:12

Re: XOR Verknüpfung, wie?
 
Hai alzaimer,

wo kommt denn in deiner Funktion das r her? ;-)

Klaus01 22. Feb 2006 07:13

Re: XOR Verknüpfung, wie?
 
Zitat:

Also ich bin nun fast fertig. Nur die Ergebnisse hauen noch nicht so hin

wieso kann ich denn nicht

Delphi-Quellcode:
vString:=GetString();
  strSN:=GrobPath1(vString);
  intSN:=StrToInt(strSN);
  Ergebnis:= IntToHex(ord(intSN[1]),2) xor IntToHex(ord(intSN[2]),2).... // geht so nicht!
  WriteString();
  Checksum:=IntToHex(Ergebnis,2);

Wieso bringt der da einen Fehler? Irgendsoetwas mir Array.

Wichtig ist, dass ich den die Zahl(123456) die ja ein String ist in die einzelnen Ziffern aufteilt und dann diese einzelnen Ziffern in einen Hexwert(Ascii) umwandelt und dann xor verknüpfe.

Habt Ihr da ne Lösung?
IntToHex liefert Dir einen String mit den HexDigits und nicht den Ascii-Wert des Zeichens.
Aus der Hilfe:
Zitat:

function IntToHex(Value: Integer; Digits: Integer): string; overload;
Um die Zeichen mit XOR zu verknüpfen müssen diese in ihrem Ascii Wert verknüpft werden
Aus der Hilfe:
Zitat:

xor bitwise xor integer integer X xor Y
Grüße
Klaus

DoktorD 22. Feb 2006 07:15

Re: XOR Verknüpfung, wie?
 
So wie du es jetzt vorschlägst hatte ich es auch gedacht.
Aber die Leerzeichen (0x20) und das <STX> (0x02) gehen ja auch zu Checksummen Berechnung ein.
Funktioniert das dann auch?

Die CS brauche ich in HEX. Das kann ich leider nicht ändern

Klaus01 22. Feb 2006 07:22

Re: XOR Verknüpfung, wie?
 
in dem Code vom Sharky werden die Leerzeiche auch mit XOR verknüpft, denn
sie werden ja nirgends ausgefiltert.


Grüße
Klaus

DoktorD 22. Feb 2006 07:24

Re: XOR Verknüpfung, wie?
 
OK. Mit den Leerzeichen das funktioniert. Ich brauch jetzt nur noch das <STX> mit in die Berechnung einfließen zu lassen.

Schaut mal unter

http://www.torsten-horn.de/techdocs/ascii.htm

da steht bei STX : STX^B

Kann ich das so einfach reinschreiben?

oder kann ich auch "ord(<STX>)" nehmen. Geht das überhaupt?

Klaus01 22. Feb 2006 07:31

Re: XOR Verknüpfung, wie?
 
Hier der angepasste Code vom alzaimar
wenn Du STX als Startwert nimmst, wird STX auch in der Checksummer auftauchen.

Grüße
Klaus

Delphi-Quellcode:
Function CheckSum (Const aString : String) : String;
Var
  i : Integer;
  r :Byte;
 
Begin
  If Length (aString)=0 Then
    r := 0
  Else Begin
     
    r := 2; //STX ^B
    For i:=1 To Length (aString) Do
      r := r xor Ord (aString[i]);
    End;
  Result := IntToHex (r,2);
End;

DoktorD 22. Feb 2006 07:49

Re: XOR Verknüpfung, wie?
 
Es funktioniert.

Vielen, vielen Dank an alle, die mir geholfen haben. Ich ziehe den Hut vor Euch!!!!

Sharky 22. Feb 2006 08:02

Re: XOR Verknüpfung, wie?
 
Zitat:

Zitat von DoktorD
Es funktioniert.

Hai DoktorD,

einen kleinen Tipp habe ich noch. Versuche solche Funktionen ersteinmal allgemein zu halten und dann in einer zweiten Funktion die besonderen Randbedingungen vorzugeben. Dadurch ereichst Du eine höhere Wiederverwendbarkeit deines Codes:
Zum Beispiel:
Delphi-Quellcode:
function CheckSumFromString(const aString: String): Integer; // Allgemeine Checksummenbildung über einen String
var
  i: Integer;
  r: Integer;
begin
  if Length(aString) = 0 then
  begin
    r := 0;
  end
  else
  begin
    r := Ord(aString[1]);
    for i := 2 to Length(aString) do
    begin
      r := r xor Ord(aString[i]);
    end;
  end;
  Result := r;
end;

function CalcMyCheckSum(const aString: String): String; //Mit dem Randbedingungen
const
  stx   = #2;
  praefix = 'OWE 509 ';
begin
  Result := IntToHex(CheckSumFromString(stx + praefix + aString), 2);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  blubb: String;
begin
  blubb := CalcMyCheckSum('12346579');
  ShowMessage(blubb);
end;

DoktorD 23. Feb 2006 09:38

Re: XOR Verknüpfung, wie?
 
Zu früh gefreut.

Das Programm welches in das Textfile, welches ich auslesen will, sperrt anscheinend diese Datei.
Klappt das wenn ich das mit diesem fmOpenRead löse?? Ich hab keine Ahnung, wie das geht.

Zur Zeit mache ich das so

Delphi-Quellcode:
function TForm1.GetString():String;
var
  F1: TextFile;
  Text: String;
begin
    try
      AssignFile(F1, sText1);
      Reset(F1);
      while not Eof(F1) do
        begin
          Read(F1, Text);
        end;
      CloseFile(F1);
      result := Text;
    except
      ShowMessage('Fehler beim auslesen der Textdatei');
    end;
end;
Danke!

Klaus01 23. Feb 2006 09:57

Re: XOR Verknüpfung, wie?
 
uups hab auf etwas anderes geantwortet.

Zitat:

das ich IMHO auch völlig korrekt.

1 Byte 0- 255 in Hex 0 - FF

Ein Digit in Hex entsprechen 4 Bit (1 Nibble) und können Werte von 0 bis F annehmen.

Grüße
Klaus

Klaus01 23. Feb 2006 10:06

Re: XOR Verknüpfung, wie?
 
.. das hängt wohl davon ab in welchem Modi das andere Programm die Datei geöffnet hat.

Wenn die andere Datei geöffnet ist, kannst Du aber immer noch ein Kopie davon erstellen
und aus dieser lesen.

Grüße
Klaus

Klaus01 23. Feb 2006 10:10

Re: XOR Verknüpfung, wie?
 
Delphi-Quellcode:
function TForm1.GetString():String;
var
  F1: TextFile;
  Text: String;
begin
  AssignFile(F1, sText1);
  {$I-}
    Reset(F1);
  {$I+}
  if IOResult = 0 then
    begin
      while not Eof(F1) do
        begin
          Read(F1, Text);
        end;
      CloseFile(F1);
      result := Text;
    end
  else
     begin
       // IORsult abfragen, welcher Fehler
       // Datei kopieren, auslesen
    end;
end;

sminds 31. Jul 2006 17:41

Re: XOR Verknüpfung, wie?
 
Hallo,
habe ein ähnliches Problem wie DoktorD, nur muß ich die einzelnen Werte als HEX-Werte mit XOR Verknüpfen.

Ich habe z.B. die

HEX-Werte

01 30 31 02 30 32 30 30 43 38 03

das XOR-Ergebnis lautet 78, wenn ich die Werte in einem Taschenrechner unter HEX eingebe.


Mit dieser Funktion erhalte ich 32 .... :(

Delphi-Quellcode:
VAR
  elemente:array[1..11] of byte;
  i:Byte;
  dummy:Byte;
begin
  elemente[1]:=01;
  elemente[2]:=30;
  elemente[3]:=31;
  elemente[4]:=02;
  elemente[5]:=30;
  elemente[6]:=32;
  elemente[7]:=30;
  elemente[8]:=30;
  elemente[9]:=43;
  elemente[10]:=38;
  elemente[11]:=03;

  dummy:=ord(elemente[1]) XOR ord(elemente[2]);

  for i:=3 to length(elemente) DO
    begin
      dummy:=dummy XOR ord(elemente[i]);
    end;

  // dummy = 50, hex von 50 = 32
  showmessage(IntToHex(dummy,2));
Könnt ihr mir bitte einen Hinweis geben, wie ich diese Funktion ändern kann, damit ich den richtigen Wert 78 erhalte.

Vielen Dank,
egonsa

Khabarakh 31. Jul 2006 17:45

Re: XOR Verknüpfung, wie?
 
Wenn die Werte im Hexadzimalsystem stehen, musst du sie natürlich auch entsprechend notieren:
Delphi-Quellcode:
elemente[1] := $01; // gut, bei diesem Wert wäre es noch egal ;)
[...]

sminds 31. Jul 2006 17:51

Re: XOR Verknüpfung, wie?
 
Danke Khabarakh,
das es so einfach ist, hätte ich nicht gedacht :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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