Autor Beitrag
pchero
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 12.08.09 15:16 
Guten Nabend,

ich habe eine kleine Frage und zwar connecte ich mittels Socket auf ein Gerät und nun will ich einen Befehl in Hex Format an dieses Gerät schicken. Dieses Gerät antwortet denn auch darauf. Ist ja nichts anderen als mit Socket.ReceiveText das mitzulesen oder brauch ich dafür denn auch einen anderen Befehl?

Hab schon gesucht aber nicht zum Thema Hex Code über Delphi und Socket zu verschicken

Gruß


Zuletzt bearbeitet von pchero am Di 18.08.09 10:29, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 12.08.09 15:20 
Moin!

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
einen Befehl in Hex Format
Was ist denn ein "Befehl in Hex Format"? :gruebel: Meinst du Binärdaten? Diese könnte man hexadezimal darstellen, falls du das mit "Hex Format" meinst. :nixweiss:

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
Dieses Gerät antwortet denn auch darauf. Ist ja nichts anderen als mit Socket.ReceiveText das mitzulesen oder brauch ich dafür denn auch einen anderen Befehl?
Sofern es sich um Binärdaten handelt: ja, das geht. Kuckst du. ;)

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: Do 13.08.09 08:29 
also mit Hex meinte ich ein TCP Paket wo der Datensatz
0b:03:f1(1011:11:11110001) aussieht. Dieses habe ich in Wireshark mitgelesen und dieses Paket mit dem Inhalt will ich selber aus Delphi heraus schicken.

Ich lese aber gleich auc nochmal deine pdf durch und schau ob ich da was finden kann was mir erlaubt den Binärcode zu schicken.

Gruß

p.s.

Also das Verschicken habe ich nun hinbekommen wusste nicht das in Delphi Hex mit $ gemacht wird ich hatte es mit 0x ausprobiert. Somit kann ich die Daten über Chr schicken lassen und in Wireshark erscheint das richtige Paket. Gibt es eine Möglichkeit das er Automatisch einen Hex Code in die EInzelnen Teile pakt und über das Chr jagt ?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.08.09 12:25 
Moin!

Sorry, aber ich verstehe kein Wort. :nixweiss:

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: Do 13.08.09 12:48 
Also ich habe jetzt hinbekommen, das er mir das TCP Paket mit den Daten 0x0b 0x03 0xf1 abschickt.
Dies mache ich jetzt über drei Inputfelder

ausblenden Delphi-Quelltext
1:
2:
bin := Chr(strtoint(Hex1.Text))+Chr(strtoint(Hex2.Text))+Chr(strtoint(Hex3.Text));
    ClientSocket1.Socket.SendText(bin); // ja, Text senden


So nun ist meine Frage, ob man das auch alles in einen Inputfeld machen kann ? oder ob man immer zwangsweise das so in drei Felder trennen muss.

Gruß PcHeRo
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Do 13.08.09 16:14 
geht mit einem
du nimmst einfach immer 2 zeichen aus einem string und fertig
also so:
ausblenden Delphi-Quelltext
1:
for i:=0 to length(S) do bin:=bin+chr(strtoint('$'+copy(s,i*2+1,2)));					


besser aber das ganze mit einem array zu machen...versuch mal mit deiner variante ne 00 zu senden...(chr(0) is textende)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.08.09 20:02 
Moin!

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
versuch mal mit deiner variante ne 00 zu senden...(chr(0) is textende)
Wo ist das Problem? Delphi-Strings sind counter-based, nicht 0-terminiert. :idea: ;)

Ansonsten gibt´s auch die Funktionen HexToBin() und BinToHex(). :les:

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: Fr 14.08.09 12:12 
ausblenden Delphi-Quelltext
1:
for i:=0 to length(S) do bin:=bin+chr(strtoint('$'+copy(s,i*2+1,2)));					

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.BtnSendClick(Sender: TObject);
var bin : string;
i: integer;
begin
  if (ClientSocket1.Active) then
  begin // sind wir online?
   {bin := Chr(strtoint(Hex1.Text))+Chr(strtoint(Hex2.Text))+Chr(strtoint(Hex3.Text));}
   for i:=0 to length(Hex1.Text) do bin:=bin+chr(strtoint('$'+copy(Hex1.Text,i*2+1,2)));
    ClientSocket1.Socket.SendText(bin);
    Log.Lines.Add(bin); // ja, Text senden
  end else
    Log.Lines.Add('Nicht verbunden!'); // nein, Meldung machen
end;

sowas ähnliches hatte ich meine ich auch ausprobiert, als ich Überhaupt mit den Hex werten angefangen habe aber diese '$'+ mag er nicht er akzeptiert das denn nicht als hexwert.
also ich möchte z.B in eine Tedit eingeben 0xB9262 und genau diesen block schickt er als Hex ins Netzwerk. Mit drei einzelnen Inputfeldern klappt es ja auch aber ned im gesamten als eine Box.
Wobei es bei Delphi ja ein $ sein muss merkwürdigerweise.

hab auch schon gegoogelt aber auch einges gefunden aber iwie nichts was so richtig hinhaut.
Wenn ich den Hex wert oben über den StrtoInt jage mekert er mir am $ zeichen rum. Oder gibt mir einen Falschen Wert wieder.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
BinMessage: String;
// die Zeichen im übergebenen String in hexadezimaler Darstellung ausgeben
function Dump(const S: String): String;
var
  i: Integer;
begin
  Result := ''// Ergebnis zunächst leer
  for i := 1 to Length(S) do begin // über alle Zeichen im String
    Result := Result +IntToHex(Ord(S[i]),2); // hex-Wert + Leerzeichen
    if ((i mod 12) = 0then // alle 12 Zeichen...
      Result := Result +#13#10// ...neue Zeile anfangen
  end;
end;
begin
  BinMessage := 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;

Bei den Rückgabewerte bekommt er auch iwas durcheinander.
so kommts zurück in
Wireshark:
0c031700d9
Konsole: 5 Zeichen gelesen:
30C17D94331

Ich bin Leider nicht so der profi wenn es um die ganzen Typen Umwandlungen geht und so =/. Aber ich gebe mein besten. Hauptsächlich is das der Code aus Narses Tutorials schonmal gleich vorweg

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

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 14.08.09 12:43 
Moin!

Vorab: IIRC hampelst du dabei mit D2009 rum (MAC-Thread), richtig? In diesem Fall sind alle String-Typen durch AnsiString zu ersetzen, sonst gibt´s Probleme mit dem Unicode-String! :idea:

user profile iconpchero hat folgendes geschrieben Zum zitierten Posting springen:
also ich möchte z.B in eine Tedit eingeben 0xB9262 und genau diesen block schickt er als Hex ins Netzwerk.
Der Trick ist, das (für den Leser gedachte) Präfix "0x" oder auch "$" bei der Eingabe wegzulassen (der PC braucht´s eh nicht). Dann könnte das so klappen:
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
    for i := 1 to Length(hex) do
      bin := bin +Chr(StrToInt('$'+Copy(hex,i*2,2)));
    ClientSocket1.Socket.SendText(bin);
//    Log.Lines.Add(bin); // das kappt sowieso nicht, da Zeichen <#32 drin sein könnten
    Log.Lines.Add(Hex1.Text);
  end
  else
    Log.Lines.Add('Nicht verbunden!'); // nein, Meldung machen
end;
cu
Narses

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


Zuletzt bearbeitet von Narses am Fr 14.08.09 14:13, insgesamt 1-mal bearbeitet
pchero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 14.08.09 13:12 
Zitat:
Exception-Klasse EConvertError mit Meldung "'$" ist kein gültiger Integer-Wert'


Zitat:
aber diese '$'+ mag er nicht

Die Meldung hatte ich schon einge mal Als ich ausprobiert habe wie ich das noch hinbekommen könnte und ist meine ich auch die selbe die ich vorher auch hatte.


Ja genau der bin ich. Aber soweit ich es sehen kann setzte ich ja keine Stringsvorab. Somit kann ich auch kein Problem damit haben außer einmal das " $ " oder muss ich da auch einen Ansistring vorsetzen ?

Und das es mit der Rückgabe nicht klappt war mir klar ;) hatte es vergessen wieder rauszunehmen.

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

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 14.08.09 13:14 
Moin!

Ups, die Schleife läuft ja viel zu weit: :oops:
ausblenden Delphi-Quelltext
1:
for i := 1 to Length(hex) shr 1 do					
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: Fr 14.08.09 13:37 
Net schlimm Narses kann jedem mal passieren =) immerhin kansnt du mir lösungwege nennen und sitzt nicht wie ich mich halbwissen davor ;)

Also hab eben deine Korrecktur noch mit reingenommen aber aus
0B03F1
wird
b03f01
also die gute Nachricht ist er erfindet die Werte schonmal nicht. Aber er mixt sie durch. Wobei ich da kein Muster erkenne wie er dies macht.

Gruß und schonmal sehr vielen dank für deine Hilfen Narses =)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 14.08.09 13:56 
Moin!

:autsch:
ausblenden Delphi-Quelltext
1:
2:
for i := 0 to (Length(hex) -1shr 1 do
  bin := bin +Chr(StrToInt('$'+Copy(hex,(i shl 1) +1,2)));
Was tue ich hier eigentlich :roll: (ich hätte HexToBin() genommen :?)

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 09:18 
Danke Narses das Sende klappt nun richtig =) ich habe eben mich nochmal mit deinem Tutorial beschäftigt und durchgelesen und so. Momentan häng ich an der Empfangsroutine von dir fest. Ja ich habe sie durchgelesen und versucht

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
BinMessage: String;
// die Zeichen im übergebenen String in hexadezimaler Darstellung ausgeben
function Dump(const S: String): String;
var
  i: Integer;
begin
  Result := ''// Ergebnis zunächst leer
  for i := 1 to Length(S) do begin // über alle Zeichen im String
    Result := Result +IntToHex(Ord(S[i]),2); // hex-Wert + Leerzeichen
    if ((i mod 12) = 0then // alle 12 Zeichen...
      Result := Result +#13#10// ...neue Zeile anfangen
  end;
end;
begin
  BinMessage := 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;


Und es sieht noch so von dir aus kopiet aus, da ich nicht die Stelle finde, die die Reihenfolge ändert. Also das Datenpaket was ich in Wireshark mitsniffe wird anders in der Box dargestellt. Und zwar auch wieder das einfach nur ein paar Zeichen vertauscht sind.

Gruß PcHeRo

und vielen dank an Narses für seine Hilfe =)=)
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 09:49 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
IIRC hampelst du dabei mit D2009 rum (MAC-Thread), richtig? In diesem Fall sind alle String-Typen durch AnsiString zu ersetzen, sonst gibt´s Probleme mit dem Unicode-String! :idea:

_________________
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 10:18 
das hatte ich auch schon gemacht, einmal alle Strings zu ansistring umgeändert aber dann kommt das bei raus:

ausblenden Quelltext
1:
2:
3:
4:
5:
0B03F1
35 Zeichen gelesen: 
484161616101000000000000
0000000000C6000000000000
0000000000000000000000


Also noch weiter vom eigentlich weg. =(

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
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 := Result +IntToHex(Ord(S[i]),2); // hex-Wert + Leerzeichen
    if ((i mod 12) = 0then // alle 12 Zeichen...
      Result := Result +#13#10// ...neue Zeile anfangen
  end;
end;
begin
  BinMessage := 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;


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 11:04 
Moin!

Tja, hier stellt sich jetzt zunächst die Frage: Was sollte denn eigentlich dabei rauskommen (zweifelsfrei)? Ich vermute, du testest direkt am offenen Herzen (also mit diesem "Gerät", was auch immer das ist). :nixweiss:

Mach mal zum Test eine Verbindung zwischen zwei Delphi-Programmen. Wie sieht das da aus?

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 11:29 
also es soll rauskommen:
ausblenden Quelltext
1:
0c031700d9					

Es kommt bei raus:
ausblenden Quelltext
1:
30C17D94331					


Das was dabei richtig rauskommen soll, lese ich immer mit Wireshark mit. Daher weiß ich auch, das dies oben Falsch ist, was er mir ausgibt.

Die Gesamte Communcation läuft über Hex ab ;). Dies wird in ein TCP Paket gepackt und dahin gesendet. Das Gerät schickt ein TCP Paket zurück, auch mit HEX Werten, wo drinne steht wie es ihm geht und all solche Status-sachen.

Das mit den zwischen 2 PC probier ich gleich mal aus.

Gruß PcHeRo
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mo 17.08.09 14:03 
wie sendest du?
als string (also nicht ansistring)?
dann versuch das ganze mal als string zu empfangen und sag, was er ausgibt.
es sieht nämlich so aus, als wären da die endianformate und stringteile vermischt...

Gesendet:
0C03 1700 D9

empfangen:
030C 0017 00D9 4331

also: die 4331 kommt weil 2x "00" fehlt-->2 bytes zu viel gelesen
und durch falsche endianess wird aus 0C03 dann halt 030C
pchero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 17.08.09 14:37 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
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;

// 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;


so hatte ich es schon ausprobiert, also den Tipp von Narses gefolgt. Hat aber nicht geholfen. Also habe ich wieder alles mit Ansi weggenommen ;)

Wenn ich es NUR als String empfange kommen nur Striche ? Ist ja auch logisch oder wie meinst du das Flamefire? Ich sende im im Unicode Format glaube ich. Aber das macht für das Gerät meine ich keinen Unterschied wie es antwortet. Ich lese wie gesagt immer in Wireshark mit, da ich sonst die Fehler ja nicht sehen würde und weiß daher auch wenn was Falsches ausgegeben wird oder zurück kommt.

Die Erklärung Flamefire klingt gut. Aber weißt du woher sowas kommen kann? 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.

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);


Gruß PcHeRo