Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi PChar mit mehreren NUL chars drin? (https://www.delphipraxis.net/148307-pchar-mit-mehreren-nul-chars-drin.html)

anse 27. Feb 2010 00:33


PChar mit mehreren NUL chars drin?
 
Ich habe in einer MySQL Tabellenzelle mehrere NUL Zeichen, also #0 drin. Mit einer row/PMYSQL_ROW greife ich auf die Zeile zu, mit row[x] auf den Zelleninhalt, was erstmal ein PChar ist, das aber am ersten NUL Zeichen bereits den String abschneidet, sobald ich das in einen String kopiere.

Ich kann die tatsächliche Länge der Zelle sogar feststellen:
Delphi-Quellcode:
var
  LengthPointer: PLongInt;
  ColLen: Integer;
begin
  ...
  LengthPointer := mysql_fetch_lengths(FLastResult);
  if LengthPointer <> nil then begin
    ColLen := PInteger(Integer(LengthPointer) + ColumnNr * SizeOf(Integer))^;
Wie aber verwende ich ColLen zum Kopieren des gesamten Strings?

sx2008 27. Feb 2010 00:55

Re: PChar mit mehreren NUL chars drin?
 
Du kannst die Daten, auf die der Zeiger verweist in einen String kopieren:
Delphi-Quellcode:
var
  s: string;
  pData : Pointer;
  len : Integer;
begin
  pData := ...
  len := ...
  SetString(s, pData, len);

himitsu 27. Feb 2010 06:15

Re: PChar mit mehreren NUL chars drin?
 
Es gibt keinen PCharString mit #0 drin, denn laut Definition wird dort die #0 als End-Markierung verwendet.

Das einfache Zuweisen ala String := PChar; nutzt genau dieses um die Länge zu bestimmen.

Ausnahmen:
- PChar mit zusätzlicher Längenangabe
- ein PChar-String-Array (z.B. der Opendialog nutzt Soeines ... dort ist #0#0 das Array-Ende und #0 das Ende der Einzelnen Strings)

Fazit:
Jenachdem welche Daten im PChar drin sind, muß man andere Zugriffs-/Kopiermaßnahmen ergreifen.

In diesem Fall macht sich womöglich SetString recht gut, da man dort die Länge angeben kann.

SirThornberry 27. Feb 2010 07:13

Re: PChar mit mehreren NUL chars drin?
 
@himitsu: Das ist so nicht richtig. Nur weil PChar häufig 0-Terminiert verwendet wird heißt das noch lange nicht das PChar so definiert ist das dort Schluss ist. PChar heißt schließlich nichts anderes als: Pointer auf EINEN Char. Da wird also nicht mal definiert das welche dahinter kommen. Es ist schlichtweg nur ein typisierter Pointer.

anse 27. Feb 2010 07:38

Re: PChar mit mehreren NUL chars drin?
 
Super - danke, mit SetString funktionierts !

himitsu 27. Feb 2010 08:01

Re: PChar mit mehreren NUL chars drin?
 
@Bärchen: Drum hatte ich extra PCharString geschrieben.

Und beim "einfachen" String gibt es nunmal diese Fälle:
- Zeiger + #0
- Zeiger + extra Längenangabe
(bei einem Zeiger auf ein einzelnes Zeichen ist ja die Längenangabe implizit in der Definition verankert)

Über irgendwas mußt man ja das Ende kennzeichnen.
Wenn man nun einen "String" mit Längenangabe hat und in diesem auch noch #0en enthalten sind, dann muß man eben diese Längenangabe verwenden, welches ja SetString auch macht.

anse 27. Feb 2010 08:09

Re: PChar mit mehreren NUL chars drin?
 
Es gibt aber keine Längenangabe am Ende der PMYSQL_ROW Zelle, es ist ein PChar mit #0 am Ende und zusätzlichen #0 im Inhalt, weil der User dort welche INSERTed hat. SetString kann und muß man ja die String-Länge übergeben, deswegen gehts damit.


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