![]() |
record an procedure übergeben
Delphi-Quellcode:
das ist der anfang einer unit zum erzeugen von icmp-packeten.
unit WSock;
interface uses WinSock; type PIcmpHeader = ^TIcmpHeader; TIcmpHeader = record MT : Char; // ICMP Message Typ MC : Char; // Message Interner (Fehler-)Code CS : Byte; // Checksum, muss vor berechnung selbiger auf "00" gesetzt werden. ID : Byte; // ID des Pakets Se : Byte; // Sequenznummer, bei mehreren typgleichen, (sinn-)zusammenhängenden Paketen TS : Cardinal; // Zeitstempel beim Abesenden end; var Header: TIcmpHeader; hd_addr: PIcmpHeader; implementation uses Unit1; end. meine frage: wie kann ich folgender procedure beibiegen, das sie mir eine checksumme aus dem o.g. record liefert?
Delphi-Quellcode:
wie die checksumme genau berechnet werden kann steht
{*******************************************************************
** das original dieser procedure ist in c geschrieben und wurde, ** ** soweit ich weiß, von Peter Below nach Delphi übersetzt. ** ** bei von mir angepassten stellen folgt der original code ** ** gekennzeichnet mit //[o] ** *******************************************************************} procedure Checksum(PData: PWord; Count: Integer); //[o] procedure Checksum(PData: PWord; Count: Integer): Word; var sum: Longword; i: Integer; begin sum := 0; for i:= 1 to Count do begin sum := sum + PData^; Inc(PData); if (sum and $FFFF0000) <> 0 then sum := (sum and $FFFF)+1; end; Header.usCheckSum:= not (sum and $FFFF); //[o] result:= not (sum and $FFFF); end; ![]() danke! mfg |
Re: record an procedure übergeben
Moin!
Der Procedure wird doch der Record überhaupt nicht übergeben. Daher ist das wohl schlecht möglich. Ansonsten wenn du eine Variable vom Typ des Records hast, dann kannst du doch einfach über Variablenname.CS drauf zugreifen. MfG Muetze1 |
Re: record an procedure übergeben
Zitat:
Zitat:
Einen Record übergibst du wie jede andere Variable auch:
Delphi-Quellcode:
procedure foo(bar: TMyRecord);
Und auf die Felder zugreifen tust du mit:
Delphi-Quellcode:
Das wären die Antworten auf deine Frage. Aber irgendwie habe ich das Gefühl, dass du das gar nicht wissen willst. Setzt dich mal hin, investier etwas Zeit und Mühe und formulier deine Frage noch mal, aber etwas genauer.
var
cs: String; begin cs := bar.CheckSum; |
Re: record an procedure übergeben
Moin ajz,
Du solltest übrigens erst einmal Deine Deklaration auf
Code:
ändern, da sie ansonsten Füllbytes enthält.
TIcmpHeader = [color=red][b]packed[/b][/color] [b]record[/b]
Ohne packed werden hinter dem Feld Se 3 Byte eingefügt, damit TS auf einer durch 4 teilbaren Adresse liegt. |
Re: record an procedure übergeben
Ungetested (aber im Prinzip ok :mrgreen: ):
Delphi-Quellcode:
function InternetChecksum(PData: PWord; Count: Integer):integer;
begin result := 0; while Count > 1 do begin result := result + PData^; Inc(PData); Dec(Count, 2); end; // Add left-over byte, if any if Count > 0 then Result := Result + PByte(PData)^; // Fold 32-bit sum to 16 bits while (Result and $FFFF000) <> 0 do Result := (Result and $FFFF) + (Result shr 16); Result := not Result; end; procedure CheckSumIcmpHeader(var hdr:TIcmpHeader); begin hdr.usCheckSum := 0; // nicht wegoptimieren !!! hdr.usCheckSum := InternetCheckSum(PWord(@hdr), sizeof(TIcmpHeader)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 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