Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 17.08.09 15:09 
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. :?
user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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 // sind wir online?
    bin := '';
    hex := Hex1.Text;
    if Odd(Length(hex)) then // Länge ungerade?
      hex := '0'+hex; // auffüllen
    //hex := ReverseString(hex); // ggfs. beachten: Binärzahl -> das letzte Zeichen wird zuerst gesendet!
    for i := 0 to (Length(hex) -1shr 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!'); // nein, Meldung machen
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!

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
// Daten vom Server eingetroffen
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
BinMessage: ansistring;
// die Zeichen im übergebenen String in hexadezimaler Darstellung ausgeben
function Dump(const S: ansistring): ansistring;
var
  i: Integer;
begin
  Result := ''// Ergebnis zunächst leer
  for i := 1 to Length(S) do begin // über alle Zeichen im String
    Result := ansistring(Result +IntToHex(Ord(S[i]),2)); // hex-Wert + Leerzeichen
    if ((i mod 12) = 0then // alle 12 Zeichen...
      Result := ansistring(Result +#13#10); // ...neue Zeile anfangen
  end;
end;
begin
  BinMessage := ansistring(Socket.ReceiveText); // Daten aus der Verbindung lesen
  // und ins Memo schreiben, zuerst die Zeichenanzahl ausgeben
  Log.Lines.Add(IntToStr(Length(BinMessage))+' Zeichen gelesen: '+#13#10+
  Dump(BinMessage)); // Daten in hex-Darstellung 
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.). :idea:

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
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! :idea:

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
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. :roll: 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. :nixweiss:

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
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).

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
Oder habe ich deins als String Empfangen falsch umgesetzt ?
ausblenden 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:
ausblenden 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 > 0then
    Socket.ReceiveBuf(PAnsiChar(BinMessage)^,Len);
  Dump(BinMessage));
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
pchero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 17.08.09 15:38 
Danke Narses dein Code ganze Unten hat jetzt hingehauen :D
eigentlich müsste ich unter das Programm schon fast deinen Namen druntersetzen :lol: :oops:

Bei den Geräten handelt es sich um Netzwerkgeräte, die Unterschiedliche Sachen erledigen können. Einfache Geräte die nur Discrete In und Outputs haben, bis hin zu PA Wandler oder Video Decoder und Encoder. Den Status des Gerätes kann man über Abfragen, in dem man ein HEX Paket dahinschickt, dieser dann auf dieses Antwort. Das ganze ist von einem Praktikum bei der Lufthansa Technik. Allerdings warend ie Aufgaben die sie mir aufgegeben haben ned grade die leichtesten und wollte ned hingehen und sagen: Hab ich ned hinbekommen :oops:

Da ich mich hier für eine Ausbildung als Elektroniker für Luftfahrttechnsiche Systeme machen will.

Aber jetzt klappt es =) Vielen dank An Narses =)

Und wie ich festgestellt habe wir Delphi nie meine Sprache werden. Ich bleibe da doch lieber bei PHP. :twisted:

Ist zwar keine richtige Sprache aber leichter. Und ich habe die ganzen Probleme mit den Typen nicht. Deklariert sich alles von Alleine :lol: :lol:


Gruß PcHeRo
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 17.08.09 15:54 
Moin!

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
Danke Narses dein Code ganze Unten hat jetzt hingehauen
Na fein, dann haben wir´s ja endlich. ;) Markierst du den Thread noch entsprechend, wenn dein Problem erledigt ist? Danke. :)


user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
Das ganze ist von einem Praktikum bei der Lufthansa Technik. Allerdings warend ie Aufgaben die sie mir aufgegeben haben ned grade die leichtesten und wollte ned hingehen und sagen: Hab ich ned hinbekommen :oops:

Da ich mich hier für eine Ausbildung als Elektroniker für Luftfahrttechnsiche Systeme machen will.
[...]
Und wie ich festgestellt habe wir Delphi nie meine Sprache werden. Ich bleibe da doch lieber bei PHP. :twisted:

Ist zwar keine richtige Sprache aber leichter. Und ich habe die ganzen Probleme mit den Typen nicht. Deklariert sich alles von Alleine
Du solltest dich wirklich dringend mal mit Datentypen beschäftigen, das mag auf den ersten Blick nicht einfach zu verstehen sein - aber sonst steige ich nie wieder in einen LH-Flieger! :mahn: :rofl:

PHP kennt auch Datentypen, aber - in diesem Fall: leider - macht der Interpreter automatisch kontextabhängige Typkonversion, so dass man darauf nicht unbedingt immer achten muss. :roll: Kurz: du wirst nicht drum rum kommen. :P

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.