![]() |
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:
Klappt aber natürlich nicht. kann mir Jemand helfen? Würde mich sehr freuen.
Fbytearray[0] := (ptr^ as Byte)[0];
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:
EDIT2: Die Variante mit move scheint zu klappen. Falls daran doch etwas falsch ist, bitte ich um Hinweis! :)
move(ptr, Fbytearray[0],len);
|
AW: Bytes aus Pointer in Array of Byte schreiben
Es müsste eigentlich
Delphi-Quellcode:
heißen.
move(ptr^, Fbytearray[0],len);
|
AW: Bytes aus Pointer in Array of Byte schreiben
Danke! Ich hatte mich schon gewundert, dass Lazarus beide Varianten "frisst".
LG Julian |
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. |
AW: Bytes aus Pointer in Array of Byte schreiben
Zitat:
Delphi-Quellcode:
-Operator nur bei Klassentypen (da er ein Alias für
as
Delphi-Quellcode:
ist). Wenn du hier einen direkten (harten) Typecast verwendest, dann funktioniert das auch:
System.AsClass
Delphi-Quellcode:
Alternativer Ansatz (rückwärts, ohne zusätzliche Indexvariable):
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;
Delphi-Quellcode:
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
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;
Delphi-Quellcode:
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
System.Move
Delphi-Quellcode:
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.
System.Copy
|
AW: Bytes aus Pointer in Array of Byte schreiben
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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