Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfsumme berechnen (https://www.delphipraxis.net/126127-pruefsumme-berechnen.html)

Gehstock 18. Dez 2008 14:00


Prüfsumme berechnen
 
Dat Ist ein Array of Byte was aber unterschiedlich groß sein kann
C soll die Größe des Arrays sein
ETX ein einzelnes Byte

die Funktion soll praktisch
Delphi-Quellcode:
Dat[1] xor Dat[2] Xor Dat[3] xor ETX
usw. rechnen

Delphi-Quellcode:
Function TForm1.CalcBCC(Dat : Array of Byte ; C : Integer ; ETX : Byte):Byte;
var
 I : Integer;
begin
 for I := 2 to C do
  Begin
   Result := Dat[1] xor Dat[i];
  End;
 Result := Result xor ETX;
end;
steh aber bei der umsetzung auf dem schlauch zumindes ist das ergebnis falsch

Klaus01 18. Dez 2008 14:08

Re: Prüfsumme berechnen
 
Vielleicht geht es so?

Delphi-Quellcode:
Function TForm1.CalcBCC(Dat : Array of Byte ; C : Integer ; ETX : Byte):Byte;
var
I : Integer;
begin
  result :=dat[0];           //<- korregiert
  for I := 1 to high(dat) do
      Result := result xor Dat[i];
  Result := Result xor ETX;
end;

... oder kannst Du mal eine Beispeilsequenz mit einem richtigen Ergebnis posten?

Grüße
Klaus

nicodex 18. Dez 2008 14:14

Re: Prüfsumme berechnen
 
Delphi-Quellcode:
type
  TDynByteArray = array of Byte;

function ChecksumDyn(const AData: TDynByteArray; AValue: Byte): Byte;
var
  Index: Integer;
begin
  Result := AValue;
  for Index := Low(AData) to High(AData) do
    Result := Result xor AData[Index];
end;
oder
Delphi-Quellcode:
function ChecksumPtr(AData: PByte; ASize: Cardinal; AValue: Byte): Byte;
begin
  Assert(Assigned(AData) or (ASize = 0));
  Result := AValue;
  while ASize > 0 do
  begin
    Result := Result xor AData^;
    Inc(AData);
    Dec(ASize);
  end;
end;
oder...
(kommt darauf an, wie du die Daten verwaltest)

Gehstock 18. Dez 2008 14:14

Re: Prüfsumme berechnen
 
Ja das Geht Danke

Edit: Nein So
Delphi-Quellcode:
var
I : Integer;
begin
  result := 0;
  for I := 0 to high(dat) do
      Result := result xor Dat[i];
  Result := Result xor ETX;
end;
war schon ok

himitsu 18. Dez 2008 14:15

Re: Prüfsumme berechnen
 
Klaus01 hat die 2 Problemchen eigentlich schon gefunden,
Delphi-Quellcode:
Function TForm1.CalcBCC(Dat : Array of Byte ; C : Integer ; ETX : Byte):Byte;
var
I : Integer;
begin
  Result := 0; // initialisieren
  for I := 0 to High(dat) do
    Result := Result xor Dat[i]; // mit letzem Wert verknüpfen
  Result := Result xor ETX;
end;
auch wenn man etwas noch 'nen winziges bissl optimieren kann
(bei XOR ist die Reihenvolge der Verknüpfungen ja egal)

Delphi-Quellcode:
type TByteDynArray = Array of Byte;

Function TForm1.CalcBCC(const Dat : TByteDynArray ; ETX : Byte): Byte;
var
I : Integer;
begin
  Result := ETX; // initialisieren
  for I := 0 to High(dat) do
    Result := Result xor Dat[i]; // mit letzem Wert verknüpfen
end;
PS: High(dat) hast du doch schon verwendet, wozu willst/mußt du dann die Länge noch als C übergeben? (sie steh doch schon im Array selber mit drin)

[edit]
aha, da war also doch was Neues da ... gemeckert aber nich angezeiget -.-''

gammatester 18. Dez 2008 14:48

Re: Prüfsumme berechnen
 
Zitat:

Zitat von himitsu
PS: High(dat) hast du doch schon verwendet, wozu willst/mußt du dann die Länge noch als C übergeben? (sie steh doch schon im Array selber mit drin)

Ja, aber nur bei Deiner "Optimierung". Vorher wurde nämlich ein "Open array" verwendet, das Du (aus welchen Gründen auch immer) durch ein dynamisches ersetzt hast. Beim "Open array" ist eine separate Längenangabe durchaus sinnvoll.

Frage: Kann man ein dynamisches Array der Länge 0 haben? Was macht dan Dein Code? Um richtig zu arbeiten, müßte High(dat)<0 sein!

Gammatester

himitsu 18. Dez 2008 15:04

Re: Prüfsumme berechnen
 
Zitat:

Zitat von gammatester
Ja, aber nur bei Deiner "Optimierung".

ups, hatte mir einfach den Code von Klaus01 kopiert und ganz übersehn, daß er C mal verwendete .... hmmm, wenn das so ist, dann könntest du mit dem Const+C natürlich Recht haben :oops:

OK, dann fragen wir einfach noch mit dazu:
Wie wird CalcBCC denn verwendet bzw. aufgerufen?


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