Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   PByte als String (möglichst ohne kopieren) (https://www.delphipraxis.net/158217-pbyte-als-string-moeglichst-ohne-kopieren.html)

Meta777 9. Feb 2011 18:04

Delphi-Version: 7

PByte als String (möglichst ohne kopieren)
 
Tach Allerseits,

ich habe ein Variable vom Typ PByte (LPData) und eine dazugehörige Längenangabe (FLength).
Ich möchte den PByte über eine getAsString() als String zurückgeben.
Bisher habe ich folgendes versucht:
-Als PAnsiChar typcasten - Geht nicht weil bei FLength +1 nicht immer #0 steht
-var s: String absolute LPData - geht oft aber nicht immer. Manchmal AV bei Adresse 00000000 (Referenzzählung?¿)

Momentan kopiere ich die bytes wie folgt:
Delphi-Quellcode:
  SetLength(Result, FLength);
  CopyMemory(@Result[1], LPData, FLength);
Wäre doch aber sicher irgendwie möglich das ohne zusätzliche kopiererei zu erledigen, or?

Shalom

shmia 9. Feb 2011 18:09

AW: PByte als String (möglichst ohne kopieren)
 
Delphi-Quellcode:
function GetAsString:string;
begin
  LPData := ...
  FLength := ..
  SetString(Result, LPData, FLength);
end;
SetString gibt's schon ewig und wird doch immer übersehen. :wink:

Namenloser 9. Feb 2011 18:31

AW: PByte als String (möglichst ohne kopieren)
 
Ich glaube das geht ganz einfach nicht, denn:
  • Bei einem String muss die Länge vor dem eigentlichen Pointer stehen; bei deinem Pointer nicht erfüllt.
  • Ein PChar muss nullterminiert sein; bei dir ebenfalls nicht erfüllt. Übrigens: Wenn ein PChar in einen String konvertiert wird, wird der Inhalt auch kopiert (schau mal in der System.pas bei _LStrFromPCharLen)
[edit]
@shmia: Dabei wird der Inhalt allerdings auch kopiert.
[/edit]

himitsu 9. Feb 2011 19:27

AW: PByte als String (möglichst ohne kopieren)
 
Delphi-Referenz durchsuchenSetString

In
Delphi-Quellcode:
SetString(Result, LPData, FLength);
ist quasi dein SetLength+Copy-Code drin verbaut.

Aber Kopieren wirst du oder ein fremder Code immer irgendwie müssen.



Und bitte für das Result einen AnsiString verwenden, denn dein deine Bytes sind ja wohl ANSI (1 Byte pro Zeichen).
Oder halt UTF8String, wenn es sich um derartige Daten handelt.
(falls du mal irgendwann auf einen neuere unicodenutzenden Compiler umsteigst)

[edit]
Ups, Shmia hab ich irgendwie garnicht gesehn, bzw. falsch gesehn. :oops:

Meta777 9. Feb 2011 19:58

AW: PByte als String (möglichst ohne kopieren)
 
Zitat:

Zitat von NamenLozer (Beitrag 1080616)
Ich glaube das geht ganz einfach nicht...

dachte ich mir schon. :(

Meta777 9. Feb 2011 20:02

AW: PByte als String (möglichst ohne kopieren)
 
Zitat:

Zitat von himitsu (Beitrag 1080644)
Und bitte für das Result einen AnsiString verwenden...

Ja, ist schon in Plannung, es wird noch ne GeAs(Wide-/Unicode)String geben wenn die PByte eben unicode-daten representieren.


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