Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bytes aus Pointer in Array of Byte schreiben (https://www.delphipraxis.net/199554-bytes-aus-pointer-array-byte-schreiben.html)

Julian M. 31. Jan 2019 17:12

Bytes aus Pointer in Array of Byte schreiben
 
Hallo,
ich bastel seit längerem mal wieder an meinem bass.dll webradio player.
Dort gibt es es Callback-Funktion, diese benutze ich zur Stream-Aufnahme:

Delphi-Quellcode:
procedure DownloadProc(buffer: Pointer; len:DWORD;user:Pointer); stdcall;

Derzeit schreibe ich den Buffer in einen MemoryStream:
Delphi-Quellcode:
MemoryStream.Write(buffer^, len);

Ich würde nun aber gern den Buffer direkt in ein Array of Byte schreiben. Leider gelingt mir das nicht.
Ich gehe davon aus, dass die Variable buffer ein Pointer zu ebenfalls einem Array of Byte ist und len die Anzahl der Bytes.
so ungefähr hatte ich mir das gedacht:
Delphi-Quellcode:
 Fbytearray[0] := (ptr^ as Byte)[0];
Klappt aber natürlich nicht. kann mir Jemand helfen? Würde mich sehr freuen.
LG Julian
P.S. ich benutze Lazarus 1.8.0 / Freepascal.



EDIT:
Ich bin gerade noch auf die Funktion move gestoßen. Compilieren tut er es, obs funktioniert bezweifle ich aber bzw. werde ich jetzt noch testen.
Delphi-Quellcode:
move(ptr, Fbytearray[0],len);
EDIT2: Die Variante mit move scheint zu klappen. Falls daran doch etwas falsch ist, bitte ich um Hinweis! :)

Neutral General 31. Jan 2019 18:26

AW: Bytes aus Pointer in Array of Byte schreiben
 
Es müsste eigentlich
Delphi-Quellcode:
move(ptr^, Fbytearray[0],len);
heißen.

Julian M. 31. Jan 2019 21:41

AW: Bytes aus Pointer in Array of Byte schreiben
 
Danke! Ich hatte mich schon gewundert, dass Lazarus beide Varianten "frisst".
LG Julian

Neutral General 31. Jan 2019 21:48

AW: Bytes aus Pointer in Array of Byte schreiben
 
Dass Lazarus beide Varianten frisst ist klar und richtig.
Die Variante ohne "^" sollte aber eigentlich nicht klappen und böse Nebeneffekte haben,
weil du dir damit dann (bei einer lokalen Pointervariable) den Stack zerschießen würdest/müsstest.

Dennis07 1. Feb 2019 16:40

AW: Bytes aus Pointer in Array of Byte schreiben
 
Zitat:

Zitat von Julian M. (Beitrag 1424517)
so ungefähr hatte ich mir das gedacht:
Delphi-Quellcode:
 Fbytearray[0] := (ptr^ as Byte)[0];

ist schon nah dran. Allerdings geht der
Delphi-Quellcode:
as
-Operator nur bei Klassentypen (da er ein Alias für
Delphi-Quellcode:
System.AsClass
ist). Wenn du hier einen direkten (harten) Typecast verwendest, dann funktioniert das auch:

Delphi-Quellcode:
procedure FillArray(Source: Pointer; out Target: TBytes; Len: Integer);
var
  Index: Integer;
begin
  SetLength(Target, Len);
  for Index := 0 to Pred(Len) do
  begin
    Target[Index] := TBytes(Source)[Index];
  end;
end;
Alternativer Ansatz (rückwärts, ohne zusätzliche Indexvariable):
Delphi-Quellcode:
procedure FillArray(Source: Pointer; out Target: TBytes; Len: Integer);
begin
  SetLength(Target, Len);
  Dec(Len);
  while Len >= 0 do
  begin
    Target[Len] := TBytes(Source)[Len];
    Dec(Len);
  end;
end;
Wichtig ist allerdings noch, dass die beiden Typen beim Typecast dieselbe größe haben. Das trifft auf Pointer und Byte nicht zu, da Pointer ja 32 bzw. 64 Bit hat, während Byte nur 8 besitzt. Das mit
Delphi-Quellcode:
System.Move
funktioniert theoretisch auch, aber nicht so, wie Neutral General es beschrieben hatte. Wäre aber eigentlich hier nicht notwendig. Ein anderer Weg wäre noch über
Delphi-Quellcode:
System.Copy
PS: Leider ist die Frage nicht wirklich klar gestellt, deshalb hoffe ich mal, dass ich dich richtig verstanden habe: Der Pointer zeigt auf den ersten Wert des Arrays, am Ende soll ein Byte-Array zurückgegeben werden. Es soll kopiert und nicht nur gecastet werden.

Neutral General 4. Feb 2019 09:07

AW: Bytes aus Pointer in Array of Byte schreiben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Dennis07 (Beitrag 1424566)
Das mit
Delphi-Quellcode:
System.Move
funktioniert theoretisch auch, aber nicht so, wie Neutral General es beschrieben hatte.

Was genau soll nicht funktionieren so wie ich es beschrieben habe?


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