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?!