AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Diverse Probleme mit Strings, SetLength und SizeOf
Thema durchsuchen
Ansicht
Themen-Optionen

Diverse Probleme mit Strings, SetLength und SizeOf

Ein Thema von a.def · begonnen am 1. Mai 2017 · letzter Beitrag vom 1. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2      
a.def
(Gast)

n/a Beiträge
 
#1

Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 16:37
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:
  aFileStream.Position := 0;
  SetLength(s, aFileStream.Size - (32 * SizeOf(Char)));
  aFileStream.Read(s[1], Length(s));
Die auszulesende Zeichenkette ist 32 Zeichen lang. SizeOf(Char) gibt aber 2 und 2*32 ist 64. Wieso funktioniert das trotzdem?
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 16:51
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;
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 16:58
An mod hab ich noch gar nicht gedacht, auch eine gute Idee Danke

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));
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#4

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:01
Eine letzte Frage bestünde darin, warum mein TFileStream.Write denn eigentlich nach jedem Zeichen ein NUL-Zeichen speichert
Unicode?
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:03
Ich kenne mich mit dem Hin und Her in der Zeichenwelt leider kein bisschen aus.
Kannst du bitte erklären was du meinst?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:08
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: Unicode-Tabelle

Dort kannst Du sehen, wann ein Char 'ne 0 plus ein Zeichen ist und wann zwei Zeichen.
  Mit Zitat antworten Zitat
bepe

Registriert seit: 17. Okt 2006
119 Beiträge
 
#7

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:12
Die auszulesende Zeichenkette ist 32 Zeichen lang. SizeOf(Char) gibt aber 2 und 2*32 ist 64. Wieso funktioniert das trotzdem?
Wenn ich 16*SizeOf(Char) verwende funktioniert es nicht mehr und es kommt Chinesisch als Ergebnis.
Eine letzte Frage bestünde darin, warum mein TFileStream.Write denn eigentlich nach jedem Zeichen ein NUL-Zeichen speichert
Der Standardstring ist UTF16 codiert. Also pro Zeichen 2 Byte, bei 32 Zeichen sind das 64 Byte. Da du keine "Sonderzeichen" verwendest, wird das zweite Byte nicht benötigt (daher NUL).

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.

mfg,
bp
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:16
Mhh in etwa so?

Delphi-Quellcode:
var
 s: AnsiString;
begin
 s := AnsiString(MachWas(Trim(String(s))));
 aFileStream.Write(s[1], Length(s) * SizeOf(Byte));
und
Delphi-Quellcode:
var
 s: AnsiString;
begin
 SetLength(s, aFileStream.Size - (32 * SizeOf(Byte)));
 aFileStream.Read(s[1], Length(s));
 s := AnsiString(MachWas(Trim(String(s))));
Ist dieses wilde rum-gecaste erlaubt, um die blöden Compiler-Warnungen wegzubekommen? Gespeichert und geladen wird korrekt.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:17
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#10

AW: Diverse Probleme mit Strings, SetLength und SizeOf

  Alt 1. Mai 2017, 17:20
Zitat:
Verwende keine Strings.
Was sollte man denn sonst verwenden wenn keine Strings?

Ganz am Ende der Geschichte vergleiche ich dann aber trotzdem 2 Strings.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:28 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