AGB  ·  Datenschutz  ·  Impressum  







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

c-quelltext nach Delphi portieren

Ein Thema von angos · begonnen am 14. Jan 2008 · letzter Beitrag vom 18. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#1

c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 10:51
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
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 10:57
meine Tipps heute
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
nitschchedu

Registriert seit: 24. Mär 2006
300 Beiträge
 
Delphi 7 Professional
 
#3

Re: c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 11:08
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
Programmieren ..... .
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 11:19
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?
  Mit Zitat antworten Zitat
nitschchedu

Registriert seit: 24. Mär 2006
300 Beiträge
 
Delphi 7 Professional
 
#5

Re: c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 11:36
Ä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;
Programmieren ..... .
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 11:42
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
Ansgar
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: c-quelltext nach Delphi portieren

  Alt 14. Jan 2008, 12:14
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.
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: c-quelltext nach Delphi portieren

  Alt 18. Jan 2008, 09:43
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
Ansgar
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: c-quelltext nach Delphi portieren

  Alt 18. Jan 2008, 10:29
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
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: c-quelltext nach Delphi portieren

  Alt 18. Jan 2008, 11:24
Hi,

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
Ansgar
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:39 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