![]() |
Checksum-Berechnung nach vorgegebenen C-Code
Wie übersetzt man den folgenden Code von C nach Delphi (bzw. Pascal):
Delphi-Quellcode:
Ich habe mal angefangen, aber mindestens das "byte" muss noch adäquat ersetzt werden:
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; }
Delphi-Quellcode:
Ich führe crc im Gegensatz zum C-Code oben als word-Variable mit. Daher ist das return nicht notwendig.
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; Falls hier jemand helfen kann, wäre ich dankbar. |
AW: Checksum-Berechnung nach vorgegebenen C-Code
Ich habe hier
![]() 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. |
AW: Checksum-Berechnung nach vorgegebenen C-Code
müsstest Du nicht nur byte durch data in Deinem Delphi Code ersetzen?
Grüße Klaus |
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.
|
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.
|
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 08:52 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