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
Seite 1 von 2  1 2      
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#1

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

  Alt 9. Nov 2013, 09:13
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:
    {Similar to RecvBufferEx, but readed data is stored in binary
     string, not in memory buffer.}

    function RecvBufferStr(Len: Integer; Timeout: Integer): AnsiString; virtual;
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?)
Michael Justin

Geändert von mjustin ( 9. Nov 2013 um 15:37 Uhr) Grund: statt lokale: (Default) Codepage
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#2

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

  Alt 9. Nov 2013, 09:34
Ja, kannst du machen. Ansi ist Ansi, was soll da lokaleabhängig sein?
Gruß
Cookie
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

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

  Alt 9. Nov 2013, 09:49
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 9. Nov 2013, 09:51
Ja, kannst du machen. Ansi ist Ansi, was soll da lokaleabhängig sein?
Ich nehme an, dass es Probleme gibt wenn die aktuelle Codepage manche Zeichen nicht enthält. Für Delphi 2009 und höher habe ich gerade dieses Beispiel gefunden:

https://forums.embarcadero.com/threa...threadID=70842

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.
Michael Justin
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 9. Nov 2013, 10:00
Nachtrag:

http://synapse.ararat.cz/doku.php/public:howto:d2009

Zitat:
Binary communication buffers are implemented as ansistrings. Data from socket goes to memory what is managed by ansistring and all next processing goes through ansistrings.
Wenn Free Pascal AnsiString wie in non-Unicode Delphi arbeiten, wäre es also nach diesen Angaben technisch kein Problem, Binärdaten in AnsiString zu speichern.

Ich habe eine Fehlermeldung eines Benutzers erhalten, aber noch keinen reproduzierbaren Testfall. Ich melde mich dann hier wieder, sobald es sich aufgeklärt hat.
Michael Justin

Geändert von mjustin ( 9. Nov 2013 um 10:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 9. Nov 2013, 12:19
In Delphi habe ich RawByteString verwendet, das aber erst in FPC 2.7.1 enthalten ist.
Der RawByteSting in den neueren Delphi Versionen, ist auch nur ein AnsiString.

Wenn Free Pascal AnsiString wie in non-Unicode Delphi arbeiten...
Wieso sollte in non-Unicode Versionen AnsiString anders arbeiten? Wie schon gesagt, ein AnsiString ist ein AnsiString. Da ändert sich gar nichts.
Gruß
Cookie

Geändert von cookie22 ( 9. Nov 2013 um 12:27 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 9. Nov 2013, 15:39
Ja, kannst du machen. Ansi ist Ansi, was soll da lokaleabhängig sein?
Stimmt. Meinte auch die lokalen (Default) Codepage der Sender / Empfänger Systeme. (Die auch Linux als OS einsetzen könnten.)
Michael Justin
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#8

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

  Alt 9. Nov 2013, 15:54
In Delphi habe ich RawByteString verwendet, das aber erst in FPC 2.7.1 enthalten ist.
Der RawByteSting in den neueren Delphi Versionen, ist auch nur ein AnsiString.
In Delphi 2009 ist

type RawByteString = type AnsiString(65535); In Free Pascal 2.7.1 ist

type RawByteString = type AnsiString($FFFF); Vgl. z.B. Wie funktioniert RawByteString? (ab FPC 3.x)

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:

RawByteString:      AnsiString; bzw. in C++

typedef AnsiStringT<65535> RawByteString;
Michael Justin
  Mit Zitat antworten Zitat
Namenloser

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

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

  Alt 9. Nov 2013, 16: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

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

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

  Alt 9. Nov 2013, 16: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.
$2B or not $2B

Geändert von himitsu ( 9. Nov 2013 um 16:47 Uhr)
  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 15:39 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