Moin!
Ich halte das für ein Unicode-Problem mit D2009. Hast du eine andere Delphi-Version (<D2009) zur Hand? Dann teste das mal damit. IIRC gab´s da ein Problem mit den Socket-Kompos in D2009 beim Empfang von Strings, weil die Unit intern den generischen String verwendet und hier schon die Daten ruiniert, da hilft dann der Umstieg von .ReceiveText() auf .ReceiveBuf().
Leider scheinst du aber auch nicht wirklich zu wissen, was du da eigentlich tust, das macht es nicht gerade einfacher.
pchero hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.BtnSendClick(Sender: TObject); var hex,bin: String; i: Integer; begin if ClientSocket1.Active then begin bin := ''; hex := Hex1.Text; if Odd(Length(hex)) then hex := '0'+hex; for i := 0 to (Length(hex) -1) shr 1 do bin := bin +Chr(StrToInt('$'+Copy(hex,(i shl 1) +1,2))); ClientSocket1.Socket.SendText(bin); Log.Lines.Add(hex); end else Log.Lines.Add('Nicht verbunden!'); end; | |
Das hier kann unter D2009 auf keinen Fall korrekt funktionieren, da du keinen AnsiString deklariert hast und der Socket dann definiv falsche Daten abschickt!
pchero hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var BinMessage: ansistring; function Dump(const S: ansistring): ansistring; var i: Integer; begin Result := ''; for i := 1 to Length(S) do begin Result := ansistring(Result +IntToHex(Ord(S[i]),2)); if ((i mod 12) = 0) then Result := ansistring(Result +#13#10); end; end; begin BinMessage := ansistring(Socket.ReceiveText); Log.Lines.Add(IntToStr(Length(BinMessage))+' Zeichen gelesen: '+#13#10+ Dump(BinMessage)); end; | |
Der Typecast kann da nix mehr retten, wenn der String wie oben erwähnt schon nicht mehr korrekt aus der Sockets-Unit kommt (s.o.).
pchero hat folgendes geschrieben : |
so hatte ich es schon ausprobiert, also den Tipp von Narses gefolgt. Hat aber nicht geholfen. Also habe ich wieder alles mit Ansi weggenommen  |
Nochmal: in D2009 muss das garantiert immer ein AnsiString sein (für Binärdaten im String), sonst wird das garantiert nie richtig funkionieren!
pchero hat folgendes geschrieben : |
| Wenn ich es NUR als String empfange kommen nur Striche ? [...] Ich sende im im Unicode Format glaube ich. Aber das macht für das Gerät meine ich keinen Unterschied wie es antwortet. |
Man kann keine Daten "als nur String" oder als "Hex" oder sowas empfangen, das sind einfach Binärdaten, die du in einen Memory-Container schreibst.

Und es wird für das ominöse "Gerät" auch ganz sicher eine unglaublich wichtige Rolle spielen, ob du Unicode-Daten aus dem String sendest oder nicht - weil es eben Binärdaten sind. Jetzt verrat uns doch einfach mal, was das für ein Gerät ist.
pchero hat folgendes geschrieben : |
| Wieso gibt es in Delphi keine Funktion das ich jetzt einfach das Paket was zurückkommt ausgeben kann. Also eine den Socket.ReceiveText ausgeben lassen kann ? Ohne viel daran rumzubasteln? In wireshark geht das doch auch so leicht. |
Man kann grundsätzlich keine Binärdaten "einfach so ausgeben", weil da Zeichen enthalten sind, die man nicht darstellen kann. Deshalb muss man das z.B. in hexadezimale Darstellung umwandeln (was der Kabelhai übrigens auch tut, das ist nix anderes).
pchero hat folgendes geschrieben : |
Oder habe ich deins als String Empfangen falsch umgesetzt ?
Delphi-Quelltext 1: 2:
| BinMessage := string(Socket.ReceiveText); /Auch ansistring probiert da kam aber iwas mit HAaa| oder so Log.Lines.Add(BinMessage); | |
Dieses Stück Code nutzt nix, da die Daten möglicherweise bereits nicht korrekt vom Socket gelesen werden. Probier das mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var BinMessage: AnsiString; Len: Integer; begin Len := Socket.ReceiveLength; SetLength(BinMessage,Len); if (Len > 0) then Socket.ReceiveBuf(PAnsiChar(BinMessage)^,Len); Dump(BinMessage)); |
cu
Narses
There are 10 types of people - those who understand binary and those who don´t.