Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Checksum-Berechnung nach vorgegebenen C-Code (https://www.delphipraxis.net/213209-checksum-berechnung-nach-vorgegebenen-c-code.html)

philipp.hofmann 15. Jun 2023 14:39

Checksum-Berechnung nach vorgegebenen C-Code
 
Wie übersetzt man den folgenden Code von C nach Delphi (bzw. Pascal):

Delphi-Quellcode:
FIT_UINT16 FitCRC_Get16(FIT_UINT16 crc, FIT_UINT8 byte)
{
   static const FIT_UINT16 crc_table[16] =
   {
      0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
      0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
   };
   FIT_UINT16 tmp;

   // compute checksum of lower four bits of byte
   tmp = crc_table[crc & 0xF];
   crc = (crc >> 4) & 0x0FFF;
   crc = crc ^ tmp ^ crc_table[byte & 0xF];

   // now compute checksum of upper four bits of byte
   tmp = crc_table[crc & 0xF];
   crc = (crc >> 4) & 0x0FFF;
   crc = crc ^ tmp ^ crc_table[(byte >> 4) & 0xF];

   return crc;
}
Ich habe mal angefangen, aber mindestens das "byte" muss noch adäquat ersetzt werden:

Delphi-Quellcode:
CRC_TABLE: TArray<word> = [$000, $CC01, $D801, $1400, $F001, $3C00, $2800, $E401, $A001, $6C00, $7800, $B401, $5000, $9C01, $8801, $4400];

procedure TFITWriter.ByteCRC(Data:Byte);
begin
   var tmp:Word;

   // compute checksum of lower four bits of byte
   tmp:=CRC_TABLE[crc and $F];
   crc:=(crc shr 4) and $0FFF;
   crc:=crc xor tmp xor CRC_TABLE[byte and $F];

   // now compute checksum of upper four bits of byte
   tmp:=CRC_TABLE[crc and $F];
   crc:=(crc shr 4) and $0FFF;
   crc:=crc xor tmp xor CRC_TABLE[(byte shr 4) and $F];
end;
Ich führe crc im Gegensatz zum C-Code oben als word-Variable mit. Daher ist das return nicht notwendig.

Falls hier jemand helfen kann, wäre ich dankbar.

Sherlock 15. Jun 2023 14:55

AW: Checksum-Berechnung nach vorgegebenen C-Code
 
Ich habe hier https://forums.garmin.com/developer/...utation-in-vba eine VBA Implementierung gefunden. Hilfreich dürfte dabei auch die Diskussion sein. Insbesondere welche und wieviele Bytes da durch den CRC sollen.

Sherlock
- den es fuchst, daß es bereits so viele CRCs gibt, und dann scheinbar doch nicht genug, so daß GARMIN sich noch einen aus den Fingern saugen musste.

Klaus01 15. Jun 2023 14:56

AW: Checksum-Berechnung nach vorgegebenen C-Code
 
müsstest Du nicht nur byte durch data in Deinem Delphi Code ersetzen?

Grüße
Klaus

philipp.hofmann 15. Jun 2023 15:18

AW: Checksum-Berechnung nach vorgegebenen C-Code
 
Ja, wie doof von mir. Gar nicht erkannt, ich würde auch niemals auf die Idee kommen "byte" als Variablen Namen nutzen.

philipp.hofmann 15. Jun 2023 15:24

AW: Checksum-Berechnung nach vorgegebenen C-Code
 
@Sherlock: Hast du dich mal mit dem FIT-Format beschäftigt? Nicht nur, dass Garmin zwingend ein binäres Format nutzen musste (okay, es ist wirklich sparsam zum Speicherplatz, aber ich glaube ein json gezippt, kann sogar noch kleiner sein), irgendwie unterschlagen sie in ihrer Dokumentation ein byte. Sprich in den funktionierenden Beispielen musste ich ein byte mit 0 ohne zu wissen warum, einfügen. Und ich habe bisher keine Lust jährlich 1.500 EUR auszugeben, damit Garmin dies beantwortet.

Sherlock 15. Jun 2023 15:27

AW: Checksum-Berechnung nach vorgegebenen C-Code
 
Schon der kurzen Diskussion in dem Link konnte ich entnehmen, daß das ganze wohl ziemlich nervtötend sein muß :mrgreen:

Sherlock


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