AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PChar mit mehreren NUL chars drin?

Ein Thema von anse · begonnen am 27. Feb 2010 · letzter Beitrag vom 27. Feb 2010
Antwort Antwort
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
194 Beiträge
 
Delphi 11 Alexandria
 
#1

PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 00:33
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?
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 00:55
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);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

Re: PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 06:15
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 07:13
@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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
194 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 07:38
Super - danke, mit SetString funktionierts !
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

Re: PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 08:01
@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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
194 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: PChar mit mehreren NUL chars drin?

  Alt 27. Feb 2010, 08:09
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.
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 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