Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einen bestimmten Speicherbereich in einen String kopieren (https://www.delphipraxis.net/95932-einen-bestimmten-speicherbereich-einen-string-kopieren.html)

meisteralex 16. Jul 2007 12:07


Einen bestimmten Speicherbereich in einen String kopieren
 
Puh.....ist das alles kompliziert

also ich hab hier einen Zeiger auf ein IP-Datenpaket, aus dem ich gerne Daten auslesen möchte

der Zeiger zeigt mir, soweit ich das verstehe den Anfang des IP-Datenstroms und die Länge des IP-Datenpaketes ist mir auch bekannt.

Nun möchte ich den gesammten Inhalt dieses IP-Datenpakets in einen String kopieren.

Also wie gesagt, ich besitze einen Pointer auf die Anfangsadresse und die Länge des Datenpaketes.

Gibt es irgendeine Funktion wie z.B. CopyInString(Anfangsadresse, Länge) ???

Bernhard Geyer 16. Jul 2007 12:08

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
Gibt es schon. Aber stellen deine Daten überhaupt einen String dar oder nicht irgenwelche Binärdaten?

meisteralex 16. Jul 2007 12:11

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
teils, teils, möchte aber alles erstmal in stringform haben, auch wenns teilweise kryptisch rauskommt

meisteralex 16. Jul 2007 12:15

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
ich hab hier mal den record, wwovon ich die daten auslesen müsste, ich bekomme auch eigentlich alles ausgelesen, bis auf .data ...

Delphi-Quellcode:
IP_RHDR = packed record
  Verlen:      UCHAR; //4bit version 4bit length (bytes/8)
  Service:     UCHAR; // TOS
  Length:      WORD;
  Ident:       WORD;
  Flagoff:     array[0..1] of UCHAR; //3bit flag - 13 bit offset
  TimeLive:    UCHAR;
  Protocol:    UCHAR;
  Checksum:    WORD;
  SrcIP:       array[0..3] of UCHAR;
  DestIP:      array[0..3] of UCHAR;
  Data:        array[0..0] of UCHAR;
end;

marabu 16. Jul 2007 12:33

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
Hallo,

dein Record hat einen fixen Vorspann von 20-Byte und einen variablen Anhang (Data). Wenn du ein Paket von 30 Byte hast, dann kannst du den Data-Anteil über Data[0] bis Data[9] adressieren. Die Deklaration eines einzigen Array-Elements reicht aus um bei der Adressierung auf Zeiger-Arithmetik umstellen zu können- falls du nicht mit ausgeschaltetem Range-Checking arbeiten möchtest.

Grüße vom marabu

meisteralex 16. Jul 2007 13:04

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
hmm ok ok
kannst du mir bitte mal ein bischen code aufschreiben, wie ich den variablen data-bereich in einen string bekomme ?

sirius 16. Jul 2007 13:12

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
in etwa so:
Delphi-Quellcode:
function copytoString(Adresse:pointer;laenge:integer):string;
begin
  setlength(result,laenge);
  move(Adresse^,result[1],laenge);
end;
Die Laenge ist entsprechend die Länges des Records+die Länge von Data (Es schadet aber i.A. nicht mehr zu nehmen)
Wahrscheinlich bekommst du die Länge von Data aus dem xyz.Data[0] heraus. Damit ist Länge bei dir =sizeof(Record)+ord(Record.Data[0])

marabu 16. Jul 2007 13:36

Re: Einen bestimmten Speicherbereich in einen String kopiere
 
Alternativ - wenn du es unbedingt in einem String haben möchtest:

Delphi-Quellcode:
const
  IP4P_HDRLEN = 20;
var
  s: string;
  pr: ^IP_RDHDR;
begin
  SetString(s, PChar(@pr.Data), pr.Length - IP4PHDRLEN);
end;
Getippt und nicht getestet.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 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 by Thomas Breitkreuz