AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung FreePascal [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Thema durchsuchen
Ansicht
Themen-Optionen

[FPC 2.6.2] AnsiString für binäre Daten verwendbar?

Ein Thema von mjustin · begonnen am 9. Nov 2013 · letzter Beitrag vom 9. Nov 2013
Antwort Antwort
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?

  Alt 9. Nov 2013, 15:14
Was macht denn die (65535) bzw. ($FFFF)? Die Notation kenne ich noch gar nicht... Ich kenne nur, dass man bei ShortStrings mit eckigen Klammern die maximale Länge (bis zu 255) angeben kann, aber das muss ja was anderes sein...

Übrigens, ich finde es schade, dass man nicht einfach die Bedeutung von "string" etwas aufgebohrt hat, statt 100 spezialisierte Typen einzuführen. Dann könnte es z.B. geben:
Delphi-Quellcode:
var
  a: string of AnsiChar;
  b: string of WideChar;
  c: string of Byte;
Also genau so deklariert wie ein Array, bloß mit den zusätzlichen Vorteilen eines Strings. Natürlich wäre jeder andere Typ als Arrayinhalt genau so denkbar.

Die Idee ist nicht von mir, ich habe den Vorschlag mal in einem Blog gelesen, aber ich hätte das eine sehr schöne Lösung gefunden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?

  Alt 9. Nov 2013, 15:42
Das gibt die CodePage an, welche für den String verwendet wird.

Delphi-Quellcode:
type
  UTF8String = type AnsiString(CP_UTF8);
In den neuen LongStrings wird (zumindestens in Delphi) neben der String-Länge auch noch die CodePage und die CharSize gespeichert, damit Delphi dementsprechend die Typumwandlung automatisch machen kann, also die CodePage anpassen, wenn man den String von einer Variable in eine Andere kopiert/übergibt/castet.

Nur beim RawByteString wird keine Konvertierung des Textinhaltes vorgenommen.


Das TYPE gibt dabei an, daß ein eigener Typ in der RTTI generiert wird.
Delphi-Quellcode:
type
  X = Byte;
  Y = type BYTE;
X ist nur ein Alias für Byte, während TypInfo(X) das Byte als Typ liefert.
Y ist aber ein eigener Typ, welcher so groß wie ein Byte ist. Er ist auch kompatibel mit dem normalen Byte. Aber z.B. bei der Typprüfung für Parameter wird der Typ entsprechend ausgewertet.



Ein AnsiString/UnicodeString entspricht nur Teilweise einem array of AnsiChar/WideChar .
Dort ist noch hinten eine implizite doppelte #0 angehängt und dann eben noch die zusätzlichen erwähnten Infos (CharSize und CodePage, welche vor der Length untergebracht wurden)
Außerdem ist bei den LongStrings das CopyOnWrite aktiv, was man bei den normalen Arrays oftmals leider vergessen hat zu aktivieren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Nov 2013 um 15:47 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?

  Alt 9. Nov 2013, 16:08
Nur beim RawByteString wird keine Konvertierung des Textinhaltes vorgenommen.
Genau, und deshalb kann man ihn völlig problemlos für binäre Daten verwenden, um noch zu älteren Delphi Versionen kompatibel zu bleiben definiere ich dann nur RawByteString = AnsiString.

Lediglich bei Free Pascal < 2.7.1 und Linux bin ich nicht sicher, welche Risiken die Verwendung von AnsiString für binäre Daten hat.

Aber in Kürze erhalte ich wahrscheinlich einen reproduzierbaren Testfall und das Ganze klärt sich dann eventuell auf.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?

  Alt 9. Nov 2013, 16:33
Wobei ich da inzwischen auch lieber auf TBytes , TArray<Byte> , array of Byte oder Streams umgestiegen bin.

Solange man den String nicht nicht an andere Funktionen übergibt, wo String-Umwandlungen vorkommen könnten, dann gibt es auch mit dem normalen AnsiString praktisch keine Probleme.
Ein Therapeut entspricht 1024 Gigapeut.
  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 17:44 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