![]() |
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:
Wie aber verwende ich ColLen zum Kopieren des gesamten Strings?
var
LengthPointer: PLongInt; ColLen: Integer; begin ... LengthPointer := mysql_fetch_lengths(FLastResult); if LengthPointer <> nil then begin ColLen := PInteger(Integer(LengthPointer) + ColumnNr * SizeOf(Integer))^; |
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); |
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. |
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.
|
Re: PChar mit mehreren NUL chars drin?
Super - danke, mit SetString funktionierts !
|
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. |
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 02:14 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