AGB  ·  Datenschutz  ·  Impressum  







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

CRC von C in Delphi übersetze

Ein Thema von ZOD · begonnen am 23. Mär 2023 · letzter Beitrag vom 28. Mär 2023
 
ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#1

CRC von C in Delphi übersetze

  Alt 23. Mär 2023, 14:58
Hallo zusammen,

ich kämpfe schon seit einiger Zeit mit der Aufgabe, eine gegebene C-Funktion ins Delphi zu übersetzen und brauche hierbei leider Hilfe.

Kurz der Hintergrund:
die Kommunikation mit einem Gerät erfolgt über eine Serielle Schnittstelle.
Dabei werden Kommandos an das Gerät übertragen, dass dann entsprechend antwortet.
Grundsätzlicher Aufbau der Nachrichten ist:

<Command><CRC><cr>

Im Prinzip nichts schwieriges. Der Teufel steckt im CRC, das mit jedem Kommando gesendet werden muss.
Ist der CRC (2 Byte cuclic redundancy check code) falsch, wird der gesendete Befehl zwar empfangen - die Ausführung jedoch verweigert.

Mit der Gerätedoku habe ich eine CRC Routine in C bekommen:


Code:
INT16U cal_crc_half(INT8U far *pin, INT8U len)
{
INT16U crc;
INT8U da;
INT8U far *ptr;
INT8U bCRCHign;
INT8U bCRCLow;
INT16U crc_ta[16]=
{ /* CRC look up table */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
};
ptr=pin;
crc=0;
len--;
while(len--!=0)
{
da=((INT8U)(crc>>8))>>4; /* CRC high four bits */
crc<<=4; /* The CRC is shifted to the right by 4 bits, which is equivalent to taking the lower 12
bits of the CRC. */
crc^=crc_ta[da^(*ptr>>4)]; /* Add the upper 4 bits of the CRC and the first half of the byte and
look up the table to calculate the
CRC, then add the remainder of the last CRC. */
da=((INT8U)(crc>>8))>>4; /* CRC high four bits */
crc<<=4; /* The CRC is shifted to the right by 4 bits, which is equivalent to taking the lower 12
bits of the CRC. */
crc^=crc_ta[da^(*ptr&0x0f)]; /* Add the upper 4 bits of the CRC and the last half of the byte and
look up the table to calculate the
CRC, then add the remainder of the last CRC. */
ptr++;
}
bCRCLow = crc;
bCRCHign= (INT8U)(crc>>8);
if(bCRCLow==0x28||bCRCLow==0x0d||bCRCLow==0x0a)
{
bCRCLow++;
}
if(bCRCHign==0x28||bCRCHign==0x0d||bCRCHign==0x0a)
{
bCRCHign++;
}
crc = ((INT16U)bCRCHign)<<8;
crc += bCRCLow;
return(crc);
}
Sinn der Funktion al_crc_half sollte sein, dass für einen übergebenen string ein 2-Byte CRC Wert (word ) nach obiger Vorgabe berechnet wird.

Das ist naturgemäss für CRC viel Bitschieberei. Soweit ich erkennen konnte, scheint das ein proprietärer CRC Prozess zu sein.

Leider bin ich nahezu unerfahren, was C angeht und auch sehr ungeübt, was Bitoperationen in Delphi angeht.

Daher die Frage:
kann mir jemand das wenigstens ungefähr in Delphi übersetzen?

Anmerkung:
ich habe nicht vor auf diesem Wege Arbeit durch copy-paste programmieren zu sparen.
Leider bin ich nach einigen Stunden noch am Anfang der Aufgabe - daher die Bitte um Unterstützung.

Danke für alle Hinweise und Unterstützung.

Markus
  Mit Zitat antworten Zitat
 

 

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 18:15 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