Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi c-quelltext nach Delphi portieren (https://www.delphipraxis.net/106628-c-quelltext-nach-delphi-portieren.html)

angos 14. Jan 2008 09:51


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:

// 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
};
hoffe auf hilfe,

gruß
ansgar

sirius 14. Jan 2008 09:57

Re: c-quelltext nach Delphi portieren
 
meine Tipps heute :mrgreen:
Delphi-Quellcode:
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;
Soweit erstmal, muss weg

nitschchedu 14. Jan 2008 10:08

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:
var
 msgchk: punsigned_char;
viel erfolg noch :thumb:

Muetze1 14. Jan 2008 10:19

Re: c-quelltext nach Delphi portieren
 
Zitat:

Zitat von nitschchedu
Code:
unsigned char *msgchk;             // ? Verstehe ich leider nicht
--->

Delphi-Quellcode:
var
 msgchk: punsigned_char;

Und warum ein "Var"? Schliesslich ist Var intern auch nur ein Pointer bei der Übergabe - aber wozu überhaupt? Schliesslich ist der Typ des Parameters schon ein Pointer. Warum sollte der var sein? Ich will meinen Pointer doch nicht verändern lassen von einer Funktion, welche einen CRC16 berechnen soll.

angos: Warum erfindest du das Rad neu? Warum nutzt du nicht einen der vielen Delphi Implementationen eines CRC16 Algorithmus?

nitschchedu 14. Jan 2008 10:36

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;

angos 14. Jan 2008 10:42

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

Muetze1 14. Jan 2008 11:14

Re: c-quelltext nach Delphi portieren
 
Delphi bringt keine CRC Funktionen mit, aber es wurden doch schon genug geschrieben.

- die DEC von negaH kann CRC16
- die JEDI VCL hat in der JCLMath.pas mehrere CRC16 Implementationen
- die DCPCrypt sollte dies auch können
- die HashLib! kann auch CRC16
- im Wikipedia Artikel gibt es auch fast fertigen Quellcode.

angos 18. Jan 2008 08:43

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

Muetze1 18. Jan 2008 09:29

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:
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;
Der Code wurde hier im Beitragseditor geschrieben - kann Fehler enthalten und muss nicht unbedingt funktionieren

angos 18. Jan 2008 10:24

Re: c-quelltext nach Delphi portieren
 
Hi,

Zitat:

Zitat von Muetze1
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.

Den Startwert (auch viele andere) hatte ich schon versucht, ich habe mit dem CRC_16 und dem CRC16CCITT experimentiert, mit und ohne Invertierung, leider ist nie diese summe rausgekommen.

Zitat:

Ansonsten der Code vom 1. Beitrag mal portiert:

Der Code wurde hier im Beitragseditor geschrieben - kann Fehler enthalten und muss nicht unbedingt funktionieren

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:
----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)
Gruß
Ansgar


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Seite 1 von 2  1 2      

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