AGB  ·  Datenschutz  ·  Impressum  







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

Prüfsumme berechnen

Ein Thema von Gehstock · begonnen am 18. Dez 2008 · letzter Beitrag vom 18. Dez 2008
Antwort Antwort
Gehstock

Registriert seit: 28. Jan 2006
Ort: Görlitz / Sachsen
489 Beiträge
 
Delphi 2007 Professional
 
#1

Prüfsumme berechnen

  Alt 18. Dez 2008, 15:00
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
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
Marcel
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Prüfsumme berechnen

  Alt 18. Dez 2008, 15:08
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Prüfsumme berechnen

  Alt 18. Dez 2008, 15:14
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)
  Mit Zitat antworten Zitat
Gehstock

Registriert seit: 28. Jan 2006
Ort: Görlitz / Sachsen
489 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Prüfsumme berechnen

  Alt 18. Dez 2008, 15:14
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
Marcel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: Prüfsumme berechnen

  Alt 18. Dez 2008, 15:15
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 -.-''
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

Re: Prüfsumme berechnen

  Alt 18. Dez 2008, 15:48
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: Prüfsumme berechnen

  Alt 18. Dez 2008, 16:04
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

OK, dann fragen wir einfach noch mit dazu:
Wie wird CalcBCC denn verwendet bzw. aufgerufen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:51 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