AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit CRC CCITT Prüfsumme

Ein Thema von willyxv · begonnen am 8. Jun 2011 · letzter Beitrag vom 9. Jun 2011
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 8. Jun 2011, 20:30
Ändere mal die Deklaration deiner Funktion wie folgt:
Delphi-Quellcode:
// AnsiString (8 Byte pro Zeichen)
Function GenerateCRC16(const s1:AnsiString):Word;
Ich habe auch den Namen der Klasse TForm1 weggelassen, denn es handelt sich ja
um eine ganz gewöhnliche Funktion, die unabhängig vom Formular ist.
  Mit Zitat antworten Zitat
gammatester

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

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 8. Jun 2011, 23:04
Neben der Ansistring-Problematik: Für (New_dat_uc ^ ((Old_crc_us & 0x00ff) << 8)) ^ Crc_tab[(Old_crc_us >> 8)] gilt:

Old_crc_us entspricht CRC16, New_dat_uc entspricht (ord(s[i]) and $FF), also muß der Delphicode doch wohl eher wie folgt aussehen:

CRC16 := ((ord(s[i]) and $FF) xor ((CRC16 and $FF) shl 8)) xor Crc16Tab[CRC16 shr 8]; Wie man leicht sieht, ist der Tabellenindex nur CRC16 shr 8 (ein and $FF kann man sich sparen, da CRC16 ein word ist). Außerdem ist es immer hilfreich, wenn man einige komplette Testbeispiele angibt.

Edit: Ausgeschlafen sehe ich gerade, daß der C-Code auch den Initalwert -1 also in Delphi CRC16 := $FFFF; benutzt.

Geändert von gammatester ( 9. Jun 2011 um 07:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 9. Jun 2011, 07:56
  1. Wieso muss man ausgerechnet genau diese C-Implementation übersetzen? Es gibt doch schon hunderte CRC-Funktionen die bereits in Delphi vorliegen. Da kann man sich den Stress sparen.
  2. Wieso wird ein Byte-Pointer zu einem String übersetzt?
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
gammatester

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

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 9. Jun 2011, 08:09
  1. Wieso muss man ausgerechnet genau diese C-Implementation übersetzen? Es gibt doch schon hunderte CRC-Funktionen die bereits in Delphi vorliegen. Da kann man sich den Stress sparen.
  2. Wieso wird ein Byte-Pointer zu einem String übersetzt?
Die Antwort auf die erste Frage ist doch ganz einfach: Der C-Code benutzt einen speziellen Algorithmus, der mit Pascal reproduziert werden soll. Da kann man doch nicht einfach einen beliebigen anderen nehmen.

Eine Antwort auch die zweite Frage suche ich auch schon seit Jahren, ich benutze immer array of byte oder einfach pByte etc. CRC oder Hash auf Delphi-Strings anzuwenden ist wahrscheinlich nur psychologisch zu erklären [Fast alles wird mit Strings gemacht; Strings werden neuerdings auch inkrementiert, und wenn man endlich 64-Bit-Stringlängen hat, kann man große Teile des Internets in einen String laden und durchsuchen ]
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 9. Jun 2011, 08:27
Der C-Code benutzt einen speziellen Algorithmus [...]
Stimmt - gerade gesehen. Dann ist das aber auch kein echtes CRC. Naja, okay.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
willyxv

Registriert seit: 25. Okt 2010
29 Beiträge
 
Delphi XE Enterprise
 
#6

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 9. Jun 2011, 09:23
Danke für die schnellen Antworten, aber erst mal zum Hintergrund.

Die Prüfsumme wird für die Ansteuerung eines Analysegeräts benötigt. Bis dato wurde dies von einer alten Software zuverlässig erledigt doch leider wurde nun eine Firmwareupdate durchgeführt und das alte Programm ist nun nicht mehr in der Lage sich mit dem Gerät zu Verbinden.
Um nun wieder die Ansteuerung zu ermöglichen, möchte ich ein neues Programm schreiben und da ich C nicht behersche, tue ich dies mit Delphi. Es klappt auch alles so weit so gut bis auf die Prüfsumme, das Gerät schickt mir als Antwort "ungültige Prüfsumme".

Die Berechnung der Prüfsumme habe ich so mit dem Beispiel aus der Anleitung entnommen. Leider sind hier nur zwei Zahlenbeispiele sowie der C Code (siehe oben) aufgeführt.
Beispiel 1: Wert: "274545957911547" Prüfsumme: "11547"
Beispiel 2: Wert: "385183474" Prüfsumme: "45942"

Ich habe nun verschiedene Variatnten Versucht mit dem Wert "274545957911547":

Variante 1:
Delphi-Quellcode:
Function TForm3.GenerateCRC16(Var s1:AnsiString):Word;
Var crc16:Word; i:Integer;
Begin
  crc16 := $FFFF;
  For i := 0 to Length(s1) do Begin
    CRC16 := (((Ord(s1[i])) xor ((Crc16 and $00FF) shl 8))) xor Crc16Tab[Crc16 shr 8];
  End;
  Result := crc16;
End;
Ergebniss: 4439


Variante 2:
Delphi-Quellcode:
Function TForm3.GenerateCRC16(Var s1:AnsiString):Word;
Var crc16:Word; i:Integer;
Begin
  crc16 := $FFFF;
  For i := 0 to Length(s1) do Begin
    CRC16 := (((Ord(s1[i]) and $00FF) xor ((Crc16 and $00FF) shl 8))) xor Crc16Tab[Crc16 shr 8];
  End;
  Result := crc16;
End;
Ergebniss: 4439

Variante 3:
Delphi-Quellcode:
Function TForm3.GenerateCRC16(Var s1:AnsiString):Word;
Var crc16:Word; i:Integer;
Begin
  crc16 := $FFFF;
  For i := 0 to Length(s1) do Begin
    CRC16 := (((Ord(s1[i])) xor ((Crc16) shl 8))) xor Crc16Tab[Crc16 and $FF shr 8];
  End;
  Result := crc16;
End;
Ergebniss: 13367


ich habe noch verschiedene andere Varianten versucht leider führte keine zu meinem erwünschten Ergebniss.

MfG Willy
  Mit Zitat antworten Zitat
Klaus01

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

AW: Probleme mit CRC CCITT Prüfsumme

  Alt 9. Jun 2011, 09:34
Guten Morgen,

sollte die Abfrage der Zeichenkette (AnsiString) nicht bei 1 anfangen?
Auf der Position 0 sind doch die Längenangaben abgelegt.

For i := 1 to Length(s1) do Begin Grüße
Klaus
Klaus
  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 22:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz