![]() |
c-quelltext nach Delphi portieren
Hallo leute,
ich habe hier einen C-Quelltext, welche ich gerne nach Delphi 7 portieren möchte. Es geht darum eine Checksumme zu erzeugen. ich habe die fragen und meine Ansätze im Source hinterlegt und hoffe dass ich nicht all zu sehr daneben liege... hier der Source:
Code:
typedef unsigned int WORD; // entspricht type WORD = Integer;
typedef unsigned char BYTE; // entspricht type BYTE= Char; //entspricht // chksum = record // w: Word; // BYTE ? ich weis nicht genau wie ich das übersetzen soll // end; typedef union { WORD w; struct { BYTE lo, hi; } b; } BYTEWORD; // function ComputeCRC16( // diesen teil kann ich nicht deuten --> char *msg <--, len: Integer): Word; // WORD ComputeCRC16(char *msg, int len) { BYTEWORD chksum; // var chksum: BYTEWORD; unsigned char *msgchk; // ? Verstehe ich leider nicht chksum.w = 0xFFFF; // chksum.w := #0FFFF; <<- richtig so? msgchk = (unsigned char *) msg; // auch hier komme ich nicht weiter ... while (len--) // hmm, while-schleife ist mir klar, aber was ist genau mit der abfrage (len--) gemeint? { chksum.w = chksum.b.hi ^ (ccittrev_tbl[chksum.b.lo ^ *msgchk++]); // ok, hier wird ein wert aus der tabelle aus der position "msgchk + 1" geholt, abe rauch hier wieder diese *.. was macht das? } chksum.w = ~chksum.w; // hmm, könnte mir vorstellen: chksum.w := (-1) * chksum.w; ist das richtig? return(chksum.w); // Result := chksum.w; } dazu hier noch die tabelle:
Code:
hoffe auf hilfe,// const Array of word, oder irre ich mich? static const WORD ccittrev_tbl[] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 }; gruß ansgar |
Re: c-quelltext nach Delphi portieren
meine Tipps heute :mrgreen:
Delphi-Quellcode:
Soweit erstmal, muss weg
type ByteWord=record
case boolean of TRUE: (w:word); FALSE:(lo:byte; hi:byte); end; .... function ComputeCRC16(msg:Pchar,len:integer):word ... var msgchk:Pchar //aber vielleicht kannst du hier auch string nehmen ... chksum.w := $FFFF; |
Re: c-quelltext nach Delphi portieren
Ein * ist ein bei der Daklaration von einer Variable ein Pointer auf diese .... also sieht das so aus:
Delphi-Quellcode:
unsigned_char = Byte; ///C unsigned char
punsigned_char = ^unsigned_char; ///C unsigned char *
Code:
--->
unsigned char *msgchk; // ? Verstehe ich leider nicht
Delphi-Quellcode:
viel erfolg noch :thumb:
var
msgchk: punsigned_char; |
Re: c-quelltext nach Delphi portieren
Zitat:
angos: Warum erfindest du das Rad neu? Warum nutzt du nicht einen der vielen Delphi Implementationen eines CRC16 Algorithmus? |
Re: c-quelltext nach Delphi portieren
Ähhh so war das nicht gemeint ^^
ich meinte das so zur veranschaulichung:
Delphi-Quellcode:
procedure .....;
var msgchk: punsigned_char; begin ..... kann er was damit machen end; |
Re: c-quelltext nach Delphi portieren
Hi nochmal,
@Muetze1: Es gibt dafür schon einen Algo? OO hab in der Hilfe geschaut, leider aber keinen Eintrag gefunden. Kannst du mir den Namen der Funktion nennen? Vielen Dank und Gruß Ansgar |
Re: c-quelltext nach Delphi portieren
Delphi bringt keine CRC Funktionen mit, aber es wurden doch schon genug geschrieben.
- die ![]() - die JEDI VCL hat in der JCLMath.pas mehrere CRC16 Implementationen - die ![]() - die ![]() - im ![]() |
Re: c-quelltext nach Delphi portieren
Hi nochmal,
ich komme leider nicht wirklich weiter. Momentan nutze ich das DEC von negaH und grundsätzlich komme ich damit zurecht. Leider weis ich nicht welche CRC-Einstellungen ich vornehmen muss, um den korrekten CRC zu erzeugen. Gibt es eine Möglichkeit herauszubekommen, welche CRC-Einstellungen vorgenommen werden müssen, wenn man ein paar strings + crcs als beispiele hat? Gruß Ansgar |
Re: c-quelltext nach Delphi portieren
Der Startwert für dein o.g. CRC16 Code ist $ffff. Die berechnete CRC muss dann noch invertiert werden (not), wie es die Routine auch machte (~). Dann solltest du die gleichen Summen erhalten.
Ansonsten der Code vom 1. Beitrag mal portiert:
Delphi-Quellcode:
Der Code wurde hier im Beitragseditor geschrieben - kann Fehler enthalten und muss nicht unbedingt funktionieren
function ComputeCRC16(const AData: Pointer; ADataLen: integer): word; //char *msg, int len)
var lCheckSum: Word; // chksum lDataPtr: PByte; // *msgchk begin lCheckSum := $ffff; lDataPtr := AData; while ( ADataLen > 0 ) do begin lCheckSum := Hi(lCheckSum) xor ccittrev_tbl[Lo(lCheckSum) xor lDataPtr^]; Inc(lDataPtr); Dec(ADataLen); end; result := not lCheckSum; end; |
Re: c-quelltext nach Delphi portieren
Hi,
Zitat:
Zitat:
vielen Dank für die portierung, diese lässt sich auch fehlerfrei kompilieren, erzeugt aber leider auch nicht den korrekten CRC :( Ich habe hier ein paar beispiele, vielleicht hat noch jemand eine zündende Idee... habe irgendwie das gefühl, den Wald vor lauter Bäumen nicht zu sehen... Also hier eine Liste mit Strings und den dazugehörigen CRCs. Hierbei kann ich sicher sein, dass diese korrekt sind.
Delphi-Quellcode:
Gruß
----String ---------------------------------------- CRC
CHR($05) + CHR($02) + CHR($00) | CHR($5E) + CHR($9F) CHR($01) + CHR($02) + CHR($00) + CHR($9F) | CHR($DE) + CHR($0D) CHR($02) + CHR($02) + CHR($00) | CHR($9F) + CHR($2E) Ansgar |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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