Einzelnen Beitrag anzeigen

Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#1

TIdTCPClient / WriteLn / TEncoding / TIdTextEncoding Problem

  Alt 10. Jun 2010, 12:10
Moin moin,

ich bin gerade dabei, ein Projekt von D5 (Indy 9.0.14) zu D2010 (Indy 10.5.5) zu portieren.

Zur Erklärung:
Ein TCPClient verbindet sich mit einem TCPServer - hierbei wird ein dynamisches Passwort zur
Authentifizierung verwendet/generiert. Dieses Pwd wird auch von Server generiert und dann mit
dem vom Client geschicktem Pwd verglichen => Authentifiziert/Nicht Authentifiziert.

Bei der Umstellung auf D2010 bin ich nun auf folgendes Problem gestossen (Der Server wird nicht geändert):

Delphi-Quellcode:
// Delphi 5
var
   szStr : String;
begin
   //..
   szStr := GenerierePwd(daten);
   // szStr := 'ABC' + #146 + 'DEF';
   WriteLn(szStr);
   // Am Server komt an: 'ABC' + #146 + 'DEF'
   //..
   
// Delphi 2010
var
   szStr : AnsiString;
begin
   //...
   szStr := GenerierePwd(daten);
   // szStr := 'ABC' + #146 + 'DEF';
   Socket.WriteLn(String(szStr));
   // Am Server komt an: 'ABC' + #39 + 'DEF'
   //..
Wenn das vom Client generierte Passwort Zeichen wie #146 etc. enthält, dann kommt am Server - bei dem Beispiel mit #146 -
ein #39 an, womit der Server jetzt keine Übereinstimmung der Passwörter mehr findet.

Der "Fehler" musste also beim WriteLn liegen - also mal den Debugger angeschmissen und siehe da, folgendes konnte ich finden:

Delphi-Quellcode:
uses IdGlobal;
//..
var
   strTest : AnsiString;
   a, b : TIdBytes;
begin
   strTest := 'ABC' + #146 + 'DEF';
   a := ToBytes(String(strTest), -1, 1); // a[3] = #39
   b := ToBytes(String(strTest), -1, 1, TIdTextEncoding.Default); // b[3] = #146
d.h. jetzt für mich, dass ich beim WriteLn noch das Encoding mit angeben muss.

Delphi-Quellcode:
   //..
   Socket.WriteLn(String(szStr), TIdTextEncoding.Default);
   //..
Was ich hier jetzt nicht wirklich verstehe - es funktioniert wirklich nur mit TIdTextEncoding.Default.
Mit TIdTextEncoding.ASCII usw. habe ich es auch versucht - dort kommen dann aber nur "falsche" Ergebnisse raus.

Dieses Default hört sich für mich so System-abhängig an - wie kann ich hier sicher sein, dass es auf anderen Systemen ebenfalls
korrekt funktioniert?!
Peter
-= Gruss Peter =-
-= alias x000x =-

Geändert von x000x (10. Jun 2010 um 13:31 Uhr) Grund: ToBytes => Ergebnis nachgetragen
  Mit Zitat antworten Zitat