![]() |
Diverse Probleme mit Strings, SetLength und SizeOf
In einem anderen Thread habe ich es nun endlich geschafft mein Vorhaben zu verwirklichen.
Dazu verwende ich, wie empfohlen, TFileStream und füge einer Datei am Ende 32 Zeichen hinzu. Ich lese sie dann so wieder aus
Delphi-Quellcode:
Die auszulesende Zeichenkette ist 32 Zeichen lang. SizeOf(Char) gibt aber 2 und 2*32 ist 64. Wieso funktioniert das trotzdem?
aFileStream.Position := 0;
SetLength(s, aFileStream.Size - (32 * SizeOf(Char))); aFileStream.Read(s[1], Length(s)); Wenn ich 16*SizeOf(Char) verwende funktioniert es nicht mehr und es kommt Chinesisch als Ergebnis. Mein Zweites Problem besteht darin, dass ich gerne alle X Zeichen ein neues Zeichen in meinen String einfügen möchte. Wie geht man das am besten an? |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Hingedaddelt:
Delphi-Quellcode:
function InsertZeichen(sZeichenfolge : String; chZeichen : Char; iPosition : Integer) : String;
var i : Integer; begin Result := ''; for i := 1 to Length(sZeichenfolge) do begin if i mod iPosition = 0 then Result := Result + chZeichen; Result := Result + Copy(sZeichenfolge,i,1); // oder Result := Result + sZeichenFolge[i]; end; end; |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
An mod hab ich noch gar nicht gedacht, auch eine gute Idee Danke :thumb:
Eine letzte Frage bestünde darin, warum mein TFileStream.Write denn eigentlich nach jedem Zeichen ein NUL-Zeichen speichert
Delphi-Quellcode:
s := '7215EE9C7D9DC229D2921A40E899EC5F';
aFileStream.Position := aFileStream.Size; aFileStream.Write(s[1], Length(s) * SizeOf(Char)); |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Zitat:
|
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Ich kenne mich mit dem Hin und Her in der Zeichenwelt leider kein bisschen aus.
Kannst du bitte erklären was du meinst? |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Ein Char ist (wie Du feststelltest) zwei Byte groß.
Die 0 plus eine Wert in der Größe von einem Byte. Im Unicode belegt jedes Zeichen halt zwei Byte. Bei Ansi und Ascii ist ein Char ein Byte groß. Wühl dich mal durch diese Seite: ![]() Dort kannst Du sehen, wann ein Char 'ne 0 plus ein Zeichen ist und wann zwei Zeichen. |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Zitat:
Zitat:
Du hast zwei Möglichkeiten: - Arbeite dich ins Thema ein, sonst hast du keine Freude beim Lesen und Schreiben von Texten. - Verzichte auf Unicode. Benutze nur AnsiString und AnsiChar und hoffe auf das Beste. Wegen dem roten Kasten: Bei Unicode kann ein Zeichen zwei Byte belegen, muss aber nicht. Das ist abhängig von der Kodierung. |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Mhh in etwa so?
Delphi-Quellcode:
und
var
s: AnsiString; begin s := AnsiString(MachWas(Trim(String(s)))); aFileStream.Write(s[1], Length(s) * SizeOf(Byte));
Delphi-Quellcode:
Ist dieses wilde rum-gecaste erlaubt, um die blöden Compiler-Warnungen wegzubekommen? Gespeichert und geladen wird korrekt.
var
s: AnsiString; begin SetLength(s, aFileStream.Size - (32 * SizeOf(Byte))); aFileStream.Read(s[1], Length(s)); s := AnsiString(MachWas(Trim(String(s)))); |
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Oder mach es wie empfohlen: Verwende keine Strings. Du hast Binärdaten. Hier sollte man nicht versuchen diese in irgendwelchen String-Variablen zu speichern um damit irgendwelche binären Operationen zu machen.
|
AW: Diverse Probleme mit Strings, SetLength und SizeOf
Zitat:
Ganz am Ende der Geschichte vergleiche ich dann aber trotzdem 2 Strings. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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