![]() |
an String anhängen - mal wieder Probleme mit #0
Hallo,
also ich hänge zwei Strings an einen vorhandenen String an.
Delphi-Quellcode:
Soweit so gut, nur sieht z.B. neuerString1 so aus: #6#0#0#0.
s := s + neuerString1 + neuerString2;
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? |
Re: an String anhängen - mal wieder Probleme mit #0
Sicher das die bytes nicht später bei einem anderen Aufruf abgeschnitten werden?
|
Re: an String anhängen - mal wieder Probleme mit #0
Die Bytes gehen definitiv wo anders verloren.
|
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;
|
Re: an String anhängen - mal wieder Probleme mit #0
Warum nimmst du nicht gleich einen shortstring:
Delphi-Quellcode:
s: String[4];
|
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
|
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
|
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... |
Re: an String anhängen - mal wieder Probleme mit #0
Indem du die Steuerzeichen vorher daraus entfernst oder besser eine String nimmst.
|
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. |
Re: an String anhängen - mal wieder Probleme mit #0
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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! |
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
|
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? |
Re: an String anhängen - mal wieder Probleme mit #0
oder soll #0 für ein Leerzeichen stehen?
|
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! |
Re: an String anhängen - mal wieder Probleme mit #0
Dann nutzt keinen string sondern definiert euch einen Pointer!
Zitat:
|
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
Zitat:
Aber das scheint ja nicht zu klappen... So geht's zumindest:
Delphi-Quellcode:
Aber statisches Array war irgendwie eleganter, da man kein zusätzliches Längenbyte hat und sich SetLength() sparen kann.
var size: LongWord; strsize: String[4];
//... SetLength(strsize, 4); Move(size, strsize[1], 4); s := s + strsize; Aber Strings fester Länge gibts ja nicht und mit dem Array eben das Problem mit dem #0 abschneiden... |
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
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. |
Re: an String anhängen - mal wieder Probleme mit #0
Also meine Struktur stellt einen RIFF-Chunk dar (Wave-Dateien).
Delphi-Quellcode:
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).
type
TID = array[0..3] of Char; TChunk = record ID: TID; Size: LongWord; Stream: String; end; TChunks = array of TChunk; //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. |
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? |
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
Zitat:
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? |
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
![]() ![]() ![]() Zitat:
![]() Zitat:
|
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: |
Re: an String anhängen - mal wieder Probleme mit #0
Zitat:
Auch der Aufwand wo es doch vorgefertigtes gibt ist mir nicht erklärlich. Aber egal, jedem das seine... |
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 11:41 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