Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Verschieben in einem Speicherbereich. (https://www.delphipraxis.net/57094-verschieben-einem-speicherbereich.html)

shifter 15. Nov 2005 18:28


Verschieben in einem Speicherbereich.
 
Hi,

erstmal Cod :
Delphi-Quellcode:
Var  buf : Array [0..511] of Byte;
      s  : String;
Begin
      s := 'Hallo Peng';
      MoveMemory( @buf, @s, SizeOf( s ));

...
Also ich brauche ein 512 Byte Langes Speicherbereich in dem ich aus einem Streamer Daten Lese und wieder auf dem Streamer Ausgebe. Es hat sich ganz gut bewertet die einfache methode mit dem Array um die 512 Bytes zu reservieren.

Jetzt aber möchte ich in diesen Speicher bereich was rein copieren / verschieben, irgend wie func. das nicht so richtig.
Wenn ich nach dem MoveMemory mir den buf angucke kommt nur sch... raus und nicht das was soll.

Was mache ich den Falsch ?

Ich habe schon versucht mit Pointern zu hantieren aber es Klapt alles nicht so Richtig.

Das mit dem String ist nur Beispiel, in wirkligkeit muss ich ein Type / Record in den Speicher hinein Verschieben.

Für eure hilfe bedanke mich in vorraus.

gruss
seba

himitsu 15. Nov 2005 18:31

Re: Verschieben in einem Speicherbereich.
 
Length(s) ... nicht SizeOf :zwinker:

du willst ja die Länge des Strings und nicht die Größe des Zeigers auf diesen String ^^


[add]
Aber nimm lieber
Delphi-Quellcode:
MoveMemory(@buf, @s, Length(s) + 1);
denn so wird auch die abschließende #0 mit kopiert, welche in der Länge nicht mitgezählt wird :)

shifter 15. Nov 2005 18:39

Re: Verschieben in einem Speicherbereich.
 
Hi,

danke für die Antwordt.

Es sieht schon Besser aus , aber es ist immer noch nicht das richtige, es steckt noch irgend wo ein wurm.

Es wird jetzt die entsprechende menge an daten angezeigt, aber nicht das was es sein soll.

Please Help !

stefan2005 15. Nov 2005 18:42

Re: Verschieben in einem Speicherbereich.
 
hi,
liegt daran, dass die String-Variable s selbst nur ein Pointer auf eine Zeichenkette ist.
richtig muss es so heißen:
Delphi-Quellcode:
MoveMemory(@buf, Pointer(s), Length(s) + 1);
mfg,
stefan

shifter 15. Nov 2005 18:46

Re: Verschieben in einem Speicherbereich.
 
Ja das ist es ,

da ist aber noch was
Ich habe erwartet das am anfang von den 512 Bytes Langen Blocks wird es 'Hallo Peng' stehen und der rest solte mit $00 ausgefühlt sein, der ergebnis ist :

  • data: array[0..511] of byte = (
    $D0, $E6, $5A, $00, $70, $FF, $0F, $01, $58, $E5, $5A, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $14, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $F0, $FC, $0F, $01, $00, $00, $00, $00, $84, $FE, $0F, $01,
    $18, $EE, $91, $7C, $C8, $6A, $93, $7C, $FF, $FF, $FF, $FF, $BE, $6A, $93, $7C,
    $AD, $68, $93, $7C, $00, $00, $14, $00, $60, $00, $00, $40, $6D, $05, $92, $7C,
    $00, $00, $00, $00, $3D, $04, $92, $7C, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $CE, $33, $92, $7C, $A8, $E6, $00, $00,
    $E4, $FB, $0F, $01, $00, $00, $14, $00, $58, $FF, $0F, $01, $18, $EE, $91, $7C,
    $C0, $40, $92, $7C, $FF, $FF, $FF, $FF, $BB, $40, $92, $7C, $8E, $D6, $01, $00,
    $2C, $0B, $81, $7C, $D8, $FD, $0F, $01, $80, $00, $10, $C0, $58, $FF, $0F, $01,
    $18, $EE, $91, $7C, $70, $05, $92, $7C, $FF, $FF, $FF, $FF, $00, $00, $00, $00,
    $3D, $04, $92, $7C, $0C, $FF, $0F, $01, $75, $0B, $81, $7C, $00, $00, $00, $00,
    $38, $1E, $BC, $00, $14, $F8, $12, $00, $B0, $C4, $5B, $00, $18, $00, $00, $00,
    $00, $00, $00, $00, $F4, $FE, $0F, $01, $40, $00, $00, $00, $00, $00, $00, $00,
    $D8, $FE, $0F, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $0C, $00, $00, $00, $02, $00, $00, $00, $01, $01, $91, $7C, $00, $EC, $FD, $7F,
    $12, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $12, $00, $1A, $02,
    $F8, $0B, $15, $00, $00, $00, $00, $00, $F8, $0B, $15, $00, $01, $00, $00, $00,
    $DF, $E2, $80, $7C, $30, $FF, $0F, $01, $4F, $1A, $80, $7C, $48, $0F, $00, $00,
    $00, $00, $00, $C0, $03, $00, $00, $00, $00, $00, $00, $00, $03, $00, $00, $00,
    $00, $00, $00, $00, $00, $00, $00, $00, $70, $FF, $0F, $01, $A6, $E8, $5A, $00,
    $C4, $E8, $5A, $00, $00, $00, $00, $C0, $03, $00, $00, $00, $44, $C0, $5B, $00
    );

himitsu 15. Nov 2005 18:48

Re: Verschieben in einem Speicherbereich.
 
Nein, wenn du den Rest auch #0 haben willst, dann mußt du vorher deinen Puffer (buf) selber auf #0 setzten.

Aber ansonsten reicht es aus, wenn nach dem String eine einzige #0 steht.

shifter 15. Nov 2005 18:55

Re: Verschieben in einem Speicherbereich.
 
Kann mann den Puffer irgend wie auf anhib auf Null stellen oder muss ich byte für byte überschreiben ?

gruss
seba

himitsu 15. Nov 2005 19:00

Re: Verschieben in einem Speicherbereich.
 
Delphi-Quellcode:
procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte);
:)

shifter 15. Nov 2005 19:04

Re: Verschieben in einem Speicherbereich.
 
Das ist es ,

Ich Bedanke mich beich allen für die Hilfe.

Gruss
Seba

shifter 15. Nov 2005 19:13

Re: Verschieben in einem Speicherbereich.
 
Noch nicht Ganz fertig ,

Jetzt Habe Ich :
Delphi-Quellcode:
Type _SIGN = Record
  h : String[32];
  typ : Byte ;
  comp : Boolean;
End;

Var
   Sign : _SIGN;
   buf : Array [0.511] of Byte;

Begin

   FillMemory( @buf, 512, 0 );
   MoveMemory( @buf, xy , Sizeof( SIGN ));

...
Das mit dem String hat es 100%-ig funktioniert aber mit dem Record nicht mehr so doll.

Gruss
seba

Chewie 15. Nov 2005 19:17

Re: Verschieben in einem Speicherbereich.
 
Was ist den XY? Dein Record?
Falls ja: Bei dem Record musst du natürlich einen Zeiger darauf übergeben. Beim String musst du das nur nicht tun, da es tatsächlich schon ein Zeiger ist. Nur wird dir durch die Compiler-Magic was andres vorgegaukelt.

shifter 15. Nov 2005 19:29

Re: Verschieben in einem Speicherbereich.
 
:gruebel: Also ich denke so :

Delphi-Quellcode:
Type _SIGN = Record
  h : String[32];
  typ : Byte ;
  comp : Boolean;
End;
p_sign = ^_sign;

Var
   Po  : p_sign;
   Sign : _SIGN;
   buf : Array [0.511] of Byte;

Begin

   FillMemory( @buf, 512, 0 );
   MoveMemory( @buf, po , Sizeof( SIGN ));

...
Ich bin aber mit dem ergebnis nicht 100% sicher :
Nach jedem versicht ohne irgend etwas zu ändern sieht der ergebnis anders aus :gruebel:

gruss
seba

Chewie 15. Nov 2005 19:35

Re: Verschieben in einem Speicherbereich.
 
Zeig mal den Code, wo du po initialisierst.

shifter 15. Nov 2005 19:44

Re: Verschieben in einem Speicherbereich.
 
:shock:

Meinst Du :
Delphi-Quellcode:

  po := @sign;
Delphi-Quellcode:
Type _SIGN = Record
  h : String[32];
  typ : Byte ;
  comp : Boolean;
End;
p_sign = ^_sign;

Var
   Po  : p_sign;
   Sign : _SIGN;
   buf : Array [0.511] of Byte;

Begin
  sign.h :='blabla';

   po := @sign;
   FillMemory( @buf, 512, 0 );
   MoveMemory( @buf, po , Sizeof( SIGN ));

...
Wenn ich es so mache ist der ergebniss immer noch nicht ganz ok,
oder ich habe vieleicht andere vorstellung von der erg. :gruebel:

shifter 15. Nov 2005 19:49

Re: Verschieben in einem Speicherbereich.
 
OK ich habe geschaft :lol:

oder besse gesaht wir haben geschaft.

Ich habe Stat:
Delphi-Quellcode:
Type _SIGN = Record
  h : String[32];
  typ : Byte ;
  comp : Boolean;
End;
So Gemacht :
Delphi-Quellcode:
Type _SIGN = Record
  h : String;
  typ : Byte ;
  comp : Boolean;
End;
Und das hat die geschichte ausser bahn geworfen.

Gruss
seba

Chewie 15. Nov 2005 19:50

Re: Verschieben in einem Speicherbereich.
 
Ein hoch auf den roten Kasten...

Gut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 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