![]() |
[FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Ist in Free Pascal 2.6 der Type AnsiString zum Speichern von Binärdaten verwendbar?
In Delphi habe ich RawByteString verwendet, das aber erst in FPC 2.7.1 enthalten ist. Ich verwende RecvBufferStr aus Synapse zum Empfangen von Binärdaten, und habe aufgrund der Dokumentation angenommen, es sei möglich binäre Daten in einen AnsiString zu speichern:
Delphi-Quellcode:
Falls AnsiString jedoch von der (Default) Codepage abhängig ist, wird es beim Empfangen von Daten via Synapse in FPC Anwendungen zu korrupten Daten kommen. (Oder habe ich etwas übersehen?)
{Similar to RecvBufferEx, but readed data is stored in binary
string, not in memory buffer.} function RecvBufferStr(Len: Integer; Timeout: Integer): AnsiString; virtual; |
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Ja, kannst du machen. Ansi ist Ansi, was soll da lokaleabhängig sein?
|
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Eigentlich ist AnsiString für Binärdaten vollkommen ungeeignet. Binärdaten können einen Nullwert ($00) enthalten. Bei vielen Funktionen welche man mit AnsiStrings verwenden kann die ein Betriebssystem-API aufrufen werden die Binärdaten dann am $00 abgeschnitten da dies für C-Funktioen das String-Ende ist.
Das dies im Bereich Netzwerkverkehr oft verwendet werden kann liegt daran das hier (orginale) Binärdaten oft Codiert (Base64 und Co.) werden. |
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Zitat:
![]() Um es unter Free Pascal 2.6 zu testen, könnte ich einem AnsiString einfach der Reihe nach alle Zeichen von $0 bis $ff hinzufügen und dann kontrollieren ob es angekommen ist. Ich teste das mal. |
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Nachtrag:
![]() Zitat:
Ich habe eine Fehlermeldung eines Benutzers erhalten, aber noch keinen reproduzierbaren Testfall. Ich melde mich dann hier wieder, sobald es sich aufgeklärt hat. |
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Zitat:
Zitat:
|
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Zitat:
|
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Zitat:
Delphi-Quellcode:
In Free Pascal 2.7.1 ist
type RawByteString = type AnsiString(65535);
Delphi-Quellcode:
Vgl. z.B.
type RawByteString = type AnsiString($FFFF);
![]() Der AnsiString in Delphi 2009 und neuer verwendet defaultmäßig die aktive Codepage des Rechners auf dem das Programm ausgeführt wird. Ab Delphi 2010:
Delphi-Quellcode:
bzw. in C++
RawByteString: AnsiString;
Delphi-Quellcode:
typedef AnsiStringT<65535> RawByteString;
|
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
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:
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.
var
a: string of AnsiChar; b: string of WideChar; c: string of Byte; 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. |
AW: [FPC 2.6.2] AnsiString für binäre Daten verwendbar?
Das gibt die CodePage an, welche für den String verwendet wird.
Delphi-Quellcode:
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.
type
UTF8String = type AnsiString(CP_UTF8); 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:
X ist nur ein Alias für Byte, während TypInfo(X) das Byte als Typ liefert.
type
X = Byte; Y = type BYTE; 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
Delphi-Quellcode:
.
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 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