Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi an String anhängen - mal wieder Probleme mit #0 (https://www.delphipraxis.net/101164-string-anhaengen-mal-wieder-probleme-mit-0-a.html)

Martin K 9. Okt 2007 11:10


an String anhängen - mal wieder Probleme mit #0
 
Hallo,

also ich hänge zwei Strings an einen vorhandenen String an.
Delphi-Quellcode:
s := s + neuerString1 + neuerString2;
Soweit so gut, nur sieht z.B. neuerString1 so aus: #6#0#0#0.
Für das Schreiben in eine Datei ist es unbedingt notwendig, dass neuerString1 4 Byte groß ist, aber wenn ich neuerString1 an s anhänge mit dem obigen Quellcode, werden die letzten 3 Bytes abgeschnitten.

Was tun?

Muetze1 9. Okt 2007 11:26

Re: an String anhängen - mal wieder Probleme mit #0
 
Sicher das die bytes nicht später bei einem anderen Aufruf abgeschnitten werden?

SirThornberry 9. Okt 2007 11:28

Re: an String anhängen - mal wieder Probleme mit #0
 
Die Bytes gehen definitiv wo anders verloren.

Martin K 9. Okt 2007 11:32

Re: an String anhängen - mal wieder Probleme mit #0
 
Öhm, nein, es ist schon an der Stelle wie oben der Code, aber habe selbst grade es mit einem String getestet und festgestellt, dass es geht.
In meinem Speziellen Fall funktioniert es aber nicht, wenn neuerString1 wie folgt festgelegt ist:
Delphi-Quellcode:
var neuerString1: array[0..3] of Char;

Luckie 9. Okt 2007 11:33

Re: an String anhängen - mal wieder Probleme mit #0
 
Warum nimmst du nicht gleich einen shortstring:
Delphi-Quellcode:
s: String[4];

Bernhard Geyer 9. Okt 2007 11:35

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Martin K
Öhm, nein, es ist schon an der Stelle wie oben der Code, aber habe selbst grade es mit einem String getestet und festgestellt, dass es geht.
In meinem Speziellen Fall funktioniert es aber nicht, wenn neuerString1 wie folgt festgelegt ist:
Delphi-Quellcode:
var neuerString1: array[0..3] of Char;

Damit begiebst du dich auf die Ebene von C-Kompatiblen Strings und dort ist $#00 das Ende des Strings! Und wenn dein Array eingelsen (nach Delphi-String gewandelt) wird, ist auch #$00 das Ende des Strings.

Martin K 9. Okt 2007 11:36

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Bernhard Geyer
Damit begiebst du dich auf die Ebene von C-Kompatiblen Strings und dort ist $#00 das Ende des Strings! Und wenn dein Array eingelsen (nach Delphi-String gewandelt) wird, ist auch #$00 das Ende des Strings.

Schön und gut, aber wie kann ich ein Array of Char an einen String anhängen, ohne dass mir dabei Bytes verloren gehen?

Muetze1 9. Okt 2007 11:37

Re: an String anhängen - mal wieder Probleme mit #0
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das geht definitiv auch. Getestet mit BDS2006, siehe Anhang (wovon die Turbo's nur eine Ausgliederung sind)

War ein gutes Gegenbeispiel - er schneidet sie genauso ab...

mkinzler 9. Okt 2007 11:37

Re: an String anhängen - mal wieder Probleme mit #0
 
Indem du die Steuerzeichen vorher daraus entfernst oder besser eine String nimmst.

bernau 9. Okt 2007 11:41

Re: an String anhängen - mal wieder Probleme mit #0
 
Was hier noch gar nicht gefragt wurde:

Mit welcher Funktion schreibst du die Daten in die Datei?

Verwendest du einen TFilestream, oder schreibst du mit "writeln" und Konsorten.

Martin K 9. Okt 2007 11:43

Re: an String anhängen - mal wieder Probleme mit #0
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Muetze1
Das geht definitiv auch. Getestet mit BDS2006, siehe Anhang (wovon die Turbo's nur eine Ausgliederung sind)

:shock: :shock: :shock: :shock: :shock:
Also genau sowas hab ich auch grade getestet mit meinem TurboDelphi...
Achte darauf, was hier in s steht:

//Edit:
Hab net genau hingeschaut auf dein Bild, die letzten 3 Bytes von a sind bei dir abgeschnitten!

Martin K 9. Okt 2007 11:48

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von bernau
Was hier noch gar nicht gefragt wurde:

Mit welcher Funktion schreibst du die Daten in die Datei?

Verwendest du einen TFilestream, oder schreibst du mit "writeln" und Konsorten.

Ich schreibe mit TFileStream, aber das ganze wird hier aus einer selbst gebastelten Struktur eingelesen und daraus dann in den Stream geschrieben.

Muetze1 9. Okt 2007 11:51

Re: an String anhängen - mal wieder Probleme mit #0
 
Ok, stimmt, bei mir schneidet er diese auch ab.

Grundsätzlich: wenn du eine entsprechende Struktur definierst, dann definiere sie entsprechend mit dem richtigen Typ. Wenn du einen String von genau 4 Bytes schreiben willst mit dem Inhalt von #6#0#0#0 scheint es sich eher um einen Integer zu handeln, welcher in der Big-Endian Schreibweise geschrieben werden soll. Sicher das es ein String ist? Und wenn es definitiv 4 Bytes bleiben sollten, warum baust du diesen in einen String ein? Was für einen Sinn hat dies bei einer definierten Struktur?

mkinzler 9. Okt 2007 11:57

Re: an String anhängen - mal wieder Probleme mit #0
 
oder soll #0 für ein Leerzeichen stehen?

Martin K 9. Okt 2007 12:02

Re: an String anhängen - mal wieder Probleme mit #0
 
Ja, du hast recht, es handelt sich um einen 4-Byte Integerwert.
Normalerweise speichere ich diesen auch in der Struktur als Longword ab, aber hier wird ein Teil der Struktur in einen String zusammen gefasst, da er wieder Teil der Struktur eines übergeordneten Elements ist (klingt jetzt alles etwas theoretisch :mrgreen: )
Auf jeden Fall geschieht dieses Zusammenfassen in der Struktur noch vor dem Schreiben in den Stream und das soll auch so bleiben.
Ich hab dazu per Move() den Longword in das Array[0..3] of Char kopiert, mal sehen, wie es klappt wenn ich stattdessen einen String[4] nehme...

//Edit:
Ok, das funktioniert dann soweit!
Danke an euch alle!

Muetze1 9. Okt 2007 12:07

Re: an String anhängen - mal wieder Probleme mit #0
 
Dann nutzt keinen string sondern definiert euch einen Pointer!

Zitat:

Zitat von Martin K
..., mal sehen, wie es klappt wenn ich stattdessen einen String[4] nehme...

Welcher afaik aber 5 Bytes gross ist, da er vorne weg ein Längenbyte hat.

Martin K 9. Okt 2007 12:21

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Muetze1
Dann nutzt keinen string sondern definiert euch einen Pointer!

Kannst du dazu mal ein Beispiel machen?

Zitat:

Zitat von Muetze1
Welcher afaik aber 5 Bytes gross ist, da er vorne weg ein Längenbyte hat.

Ja, und genau deswegen wollt ich ja ein Array of Char nehmen, da dieses kein Längenbyte benötigt.
Aber das scheint ja nicht zu klappen...
So geht's zumindest:
Delphi-Quellcode:
var size: LongWord; strsize: String[4];
//...
  SetLength(strsize, 4);
  Move(size, strsize[1], 4);
  s := s + strsize;
Aber statisches Array war irgendwie eleganter, da man kein zusätzliches Längenbyte hat und sich SetLength() sparen kann.
Aber Strings fester Länge gibts ja nicht und mit dem Array eben das Problem mit dem #0 abschneiden...

Muetze1 9. Okt 2007 13:08

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Martin K
Kannst du dazu mal ein Beispiel machen?

Sind die Strukturen unterschiedlich/dynamisch lang?

Wenn nicht: Struktur (record) definieren.
Wenn ja: Pointer übergeben, entsprechend Platz reservieren und diesen mit den Daten füllen. Übergeben werden müsste der Pointer sowie die Grösse der Daten.

Martin K 9. Okt 2007 13:18

Re: an String anhängen - mal wieder Probleme mit #0
 
Also meine Struktur stellt einen RIFF-Chunk dar (Wave-Dateien).
Delphi-Quellcode:
type
  TID = array[0..3] of Char;
  TChunk = record
    ID: TID;
    Size: LongWord;
    Stream: String;
  end;
  TChunks = array of TChunk;
Also ID ist ein 4 Byte String, Size gibt die Größe des Stream an und Stream ist der entsprechende Stream als String (wurde mit SetLength() auf die Größe gesetzt, die auch in Size steht).

//Edit:
und in dem Fall jetzt, fasse ich Chunks zusammen und schreibe diese in einen "übergeordneten Chunk", also ein übergeordneter Chunk erhält als Stream der Reihe nach ID,Size,Stream der untergeordneten Chunks.
Dabei gab es eben das Problem, den LongWord in String umzuwandeln, sprich: die Größe eines untergeordneten Chunks an den Stream des übergeordneten Chunks anhängen.

Muetze1 9. Okt 2007 13:39

Re: an String anhängen - mal wieder Probleme mit #0
 
1. Warum nutzt ihr nicht die Lese- und Schreibroutinen für das RIFF Format von Windows?
2. Warum ein String und nicht z.B. ein TMemoryStream?

Martin K 9. Okt 2007 13:47

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Muetze1
1. Warum nutzt ihr nicht die Lese- und Schreibroutinen für das RIFF Format von Windows?

Öhm, wie wo was?

Zitat:

Zitat von Muetze1
2. Warum ein String und nicht z.B. ein TMemoryStream?

Hmm, kann ich denn Teile aus einem FileStream in einen neuen MemoryStream kopieren?
Das mit dem String hab ich auch der Einfachheit halber gemacht, da muss ich mich dann nicht um's Freigeben und so kümmern...

//Edit: Warum sprichst du mich eigentlich mit 'ihr' an?

Muetze1 9. Okt 2007 14:04

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Martin K
Zitat:

Zitat von Muetze1
1. Warum nutzt ihr nicht die Lese- und Schreibroutinen für das RIFF Format von Windows?

Öhm, wie wo was?

Die MultiMedia API Teil der WinAPI offeriert Dateioperationen zum Umgang mit dem RIFF Format. Darin fallen u.a. WAVE und AVI Dateien. Hier ein Beispiel aus der MSDN. Eine Funktionsübersicht findest du hier (alles mit mmio am Anfang). Und hier findest du den Einstiegspunkt in der MSDN zu der MultiMedia Abteilung.

Zitat:

Zitat von Martin K
Zitat:

Zitat von Muetze1
2. Warum ein String und nicht z.B. ein TMemoryStream?

Hmm, kann ich denn Teile aus einem FileStream in einen neuen MemoryStream kopieren?

Klaro. Ist schliesslich alles von TStream abgeleitet und somit kompatibel. Delphi-Referenz durchsuchenTStream.CopyFrom() ist das Schlüsselwort. Ansonsten kann man es auch selber machen mit einem Read(Buffer) und Write(Buffer) wobei man dann aber selber einen Puffer bereitstellen muss.

Zitat:

Zitat von Martin K
//Edit: Warum sprichst du mich eigentlich mit 'ihr' an?

Ich habe das verwechselt...

Martin K 9. Okt 2007 18:29

Re: an String anhängen - mal wieder Probleme mit #0
 
Danke nochmals für deine Hilfe!
Aber ich bleibe doch bei meiner Struktur, da sie recht einfach und überschaubar ist :thumb:

Muetze1 9. Okt 2007 18:33

Re: an String anhängen - mal wieder Probleme mit #0
 
Zitat:

Zitat von Martin K
..., da sie recht einfach und überschaubar ist :thumb:

Naja, dem würde ich eher widersprechen.

Auch der Aufwand wo es doch vorgefertigtes gibt ist mir nicht erklärlich. Aber egal, jedem das seine...

Martin K 9. Okt 2007 18:36

Re: an String anhängen - mal wieder Probleme mit #0
 
Also ich wollte so eine Übersicht erstellen, welche Chunks alle in einer Datei enthalten sind und was in speziellen Chunks drinne steht.
Bei den ganzen mmio-Funktionen habe ich aber nichts gefunden, wie man eine Übersicht der Chunks enthält, eher wie man spezielle Chunks findet.
Wobei ich noch nicht so ganz herausgefunden habe, wie man dann den eigentlichen Inhalt eines Chunks erhält/ausliest...

//Edit:
Bei meiner Struktur mache ich es so, dass ich eben ein Array habe in dem alle Chunks stehen, diese werden einfach mit einem FileStream der Reihe nach eingelesen, also erst die ID, dann Größe und der Inhalt/Stream. Also wenn das nich einfach und übersichtlich ist, dann weiß ich auch nicht...


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