Autor Beitrag
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Sa 09.01.10 19:19 
Hey Leute,

In Delphi 2010 wird ja bekanntermaßen Unicode verwendet, weshalb die Strings andere Längen haben. Jetzt überlege ich gerade, ob ich das Ganze Protokoll schlicht "uminterpretiere" und viel Spaß mit der Längenänderung habe (btw, wie viel Byte hat denn jetzt ein Zeichen?) oder ob ich einen neuen Typ definiere, der hauptsächlich ein Array of Byte beinhaltet und dass dann irgendwie versende.

Tipps, Anregungen, Vorschläge erwünscht ;)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 09.01.10 19:23 
Schlag user profile iconNarses solange, bis er es freiwillig in seinem Tutorial korrigiert.

Alternativ: AnsiString statt String verwenden.

Ich bin für ersteres

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
FinnO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Sa 09.01.10 19:26 
Wird gemacht, Sir^^

*Baseballschläger such*

--- Moderiert:  von user profile iconFinnO: Nachtrag: ---

funktioniert leider nicht, wie gewünscht. Wenn ich mit Socket.SendText(meinAnsiString); sende werden die ersten 4 Bytes geflissentlich ignoriert :(

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  SetLength(BinMessage,4);                         //Länge auf 4Bytes <=> Integer
  PInteger(@BinMessage[1])^ := Length(edInput.Text);//Länge (int32) von erster Stelle an reinschreiben

  BinMessage := BinMessage + edInput.Text; //jetzt den Text hinten anhängen {hier ist Text z.B. #4#0#0#0'Test'

  ClientSocket.Socket.SendText(edInput.Text);

hier, beim empfangen:
ausblenden Delphi-Quelltext
1:
2:
3:
  BinMessage := Socket.ReceiveText;
  memLog.Lines.Add(BinMessage) ; {kommt "Test" heraus}
  memLog.Lines.Add(Dump(BinMessage));{kommt 54 65 73 74 heraus}


mysteriös :(
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 09.01.10 19:57 
Moin!

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Wird gemacht, Sir^^
Na dann bin ich ja mal gespannt, wie du das user profile iconNarses beibringen möchtest... 8) :twisted:

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
funktioniert leider nicht, wie gewünscht. Wenn ich mit Socket.SendText(meinAnsiString); sende werden die ersten 4 Bytes geflissentlich ignoriert :(
Du solltest vielleicht auch mal den richtigen String senden: :zwinker:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  SetLength(BinMessage,4);                         //Länge auf 4Bytes <=> Integer
  PInteger(@BinMessage[1])^ := Length(edInput.Text);//Länge (int32) von erster Stelle an reinschreiben

  BinMessage := BinMessage + edInput.Text; // kann sein, dass um edInput.Text noch ein AnsiString() muss? Habe kein D2k9...

  ClientSocket.Socket.SendText(BinMessage);

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
hier, beim empfangen:
Beim Empfang gibt es Probleme mit der Methode .ReceiveText, da muss man mit einem Workaround ran:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  var
    BinMessage: AnsiString;
    Len: Integer;
begin
  Len := Socket.ReceiveLength;
  SetLength(BinMessage,Len);
  if (Len > 0then begin
    Len := Socket.ReceiveBuf(PAnsiChar(BinMessage)^,Len);
    SetLength(BinMessage,Len);
  end;
  memLog.Lines.Add(Dump(BinMessage));
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
FinnO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Sa 09.01.10 20:06 
*tilt*

und ich dachte, sowas doofes passiert allen, nur mir nicht :D
Astat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75
Erhaltene Danke: 1

Windows 2000
D6, D7, D2007, Lazarus
BeitragVerfasst: Sa 09.01.10 20:26 
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Hey Leute,
oder ob ich einen neuen Typ definiere, der hauptsächlich ein Array of Byte beinhaltet und dass dann irgendwie versende.
Tipps, Anregungen, Vorschläge erwünscht ;)


Hallo Narses, habe meine Socketklassen alle mit Pointer und cbLen aufgebaut, alternativ auch mit array of byte.
Strings, Pchar verwende ich schon lange nicht mehr.

lg. Astat
FinnO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Sa 09.01.10 20:35 
naja, aber der unterschied zwischen einem String und einem Array of Byte hält sich wirklich mal in Grenzen ;)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 09.01.10 20:38 
Moin!

Wie im Tut zu lesen, habe ich damals deshalb Strings genommen, weil hier die Speicherverwaltung komplett von der CompilerMagic übernommen wird. Dass Embar-Bor-Inpri-Code-cadero mal aus Strings UnicodeStrings machen würde (und zwar generische!), war da nicht abzusehen. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 09.01.10 20:41 
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
naja, aber der unterschied zwischen einem String und einem Array of Byte hält sich wirklich mal in Grenzen ;)


Bis auf eins: mit Strings hat man gaanz viel Compilermagic und muss sich nicht mit fehlerträchtigen Move-Konstrukten rumschlagen.

Könnte ja auch mal einer in den NBFP-Komponenten auf `Binary` und `BinaryChar` umbauen, die per IFDEF dann auf den jeweils passenden Typen umgebogen werden. Macht IIRC die J(V)CL so.

Da aber in D2010 selbst einige Funktionen defekt sind, und trotz Ansi im Namen auf Unicode arbeiten, wird das etwas schwierig.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."