developers-forum.de

Normale Version: Antwort von UDP Verbindung übersetzen?!
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Moinsen,

also ich habe nen Prob und der N43 ist gerade nicht in ICQ ^^

Folgendes Programm erzeugt folgende Ausgabe... nur wie übersetzt man das Zahlengewirr wieder in einen lesbaren STring?? habe sowas noch nie gesehen ^^ Mein HexEditor kann das aber ich brauche für mein Programm auch ne funktion dafür... Wahrscheinlich gibts die irgendwo wieder vorgebaut nur ich weiß nicht wo nach ich suchen muss xD

Code:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,UdpSockUtil, StdCtrls,Winsock;

type
  TForm3 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    Socket : TUdpSockUtil;
    procedure Recieve(Sender:TObject);
    procedure Error(Sender:TObject;Error:Integer);
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var char : PChar;
begin
Socket := TUdpSockUtil.Create(Form3);
Socket.LocalPort := 10000;
Socket.Listen := true;
Socket.OnReceive := Recieve;
Socket.OnError := Error;
Socket.RemoteHost := '77.87.189.185';
Socket.RemotePort := 1717;
end;

function HexDump(const S: String): String;
  var
    i: Integer;
    buf,buf2 : string;
begin
  Result := '';
  for i := 1 to Length(S) do begin
    Result := Result +IntToHex(Ord(S[i]),2)+#32;
    if ((i mod 16) = 0) then
      Result := Result +#13#10;
  end;
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
Socket.Close;
end;

procedure TForm3.Recieve(Sender: TObject);
  var
    IP: in_addr;
    Msg: String;

begin
  Msg := Socket.ReceiveText(IP);
  Memo1.Lines.Add('Empfang: '+IntToStr(Length(Msg))+' Zeichen');
  Memo1.Lines.Add(HexDump(Msg));
end;

procedure TForm3.Button1Click(Sender: TObject);
var query : shortstring;
begin
  Socket.SendText(#$FE#$FD#$00+'PiNG'+#$FF#$00#$00);
  Memo1.Lines.Add('Anfrage gesendet');
end;

procedure TForm3.Error(Sender: TObject; Error: Integer);
begin
  Memo1.Lines.Add(IntToStr(Error));
end;

end.


00 50 69 4E 47 68 6F 73 74 6E 61 6D 65 00 41 41
53 41 20 7C 20 3D 5B 47 4D 5D 3D 20 45 55 20 48
6F 6E 6F 72 73 65 72 76 65 72 20 62 79 20 77 77
77 2E 67 65 72 6D 61 6E 2D 6D 61 6A 6F 72 73 2E
64 65 00 67 61 6D 65 6E 61 6D 65 00 61 72 6D 79
67 61 6D 65 00 67 61 6D 65 76 65 72 00 32 2E 38
2E 33 2E 31 00 68 6F 73 74 70 6F 72 74 00 31 37
31 36 00 6D 61 70 6E 61 6D 65 00 44 75 73 6B 00
67 61 6D 65 74 79 70 65 00 41 41 47 50 5F 47 61
6D 65 54 65 61 6D 4F 62 6A 65 63 74 69 76 65 00
6E 75 6D 70 6C 61 79 65 72 73 00 30 00 6E 75 6D
74 65 61 6D 73 00 32 00 6D 61 78 70 6C 61 79 65
72 73 00 31 38 00 67 61 6D 65 6D 6F 64 65 00 6F
70 65 6E 70 6C 61 79 69 6E 67 00 70 61 73 73 77
6F 72 64 00 30 00 74 6F 75 72 00 38 00 6F 66 66
69 63 69 61 6C 00 31 00 6C 65 61 73 65 64 00 31
00 6E 61 74 6F 00 30 00 6D 69 6C 65 73 00 30 00
63 68 65 61 74 73 00 30 00 6D 69 6E 68 6F 6E 6F
72 00 31 30 00 6D 61 78 68 6F 6E 6F 72 00 31 30
30 00 67 72 6F 75 70 73 00 41 4C 4C 00 63 75 72
72 65 6E 74 5F 72 6F 75 6E 64 00 30 2F 31 34 00
6D 69 73 73 69 6F 6E 5F 74 69 6D 65 00 36 3A 33
30 00 73 76 5F 70 75 6E 6B 62 75 73 74 65 72 00
31 00 74 6F 75 72 6E 61 6D 65 6E 74 00 30 00 65
78 70 6C 6F 72 65 5F 74 68 65 5F 61 72 6D 79 00
30 00 74 68 69 72 64 70 61 72 74 79 00 30 00 63
75 73 74 6F 6D 00 30 00 41 64 6D 69 6E 4E 61 6D
65 00 3D 5B 47 4D 5D 3D 21 63 65 54 00 41 64 6D
69 6E 45 4D 61 69 6C 00 61 64 6D 69 6E 40 67 65
72 6D 61 6E 2D 6D 61 6A 6F 72 73 2E 64 65 00 72
65 71 75 69 72 65 73 5F 61 75 74 68 6F 72 69 7A
61 74 69 6F 6E 00 31 00 63 6F 6F 70 00 30 00 61
76 65 72 61 67 65 5F 68 6F 6E 6F 72 00 2D 31 00
63 75 72 72 65 6E 74 5F 72 6F 75 6E 64 5F 69 6E
74 00 30 00 72 6F 75 6E 64 73 5F 70 65 72 5F 6D
61 74 63 68 00 31 34 00 6C 6F 63 61 6C 65 00 28
75 6E 6B 6E 6F 77 6E 29 00 6F 70 65 72 61 74 69
6E 67 5F 73 79 73 74 65 6D 00 78 38 36 20 4C 69
6E 75 78 00 61 76 65 72 61 67 65 5F 70 6C 61 79
65 72 5F 70 69 6E 67 00 2D 31 00 6D 69 73 73 69
6F 6E 5F 74 69 6D 65 5F 72 65 6D 61 69 6E 69 6E
67 00 33 39 30 00 00

Hi,

mit Chr(ch) bekommst du das Zeichen, das zum Wert ch gehört. Aber an sich hast du das doch schon in dem String Msg bzw. S aus HexDump.


N43
nope.... die Server antwort liegt ja nur in Steuerzeichen vor... bzw. man kann sie nicht in einem Memo ausgeben...

hast du zufällig lektüre zu dem thema? ich blick noch nich wirklich durch was HEx, binär, dual und der ganze scheiß ist xD

btw. mit Chr() geht es nicht denn, 4E ist kein integer! da fängts aber auch an... 4E = N nur wenn man ord(N) ausgeben lässt ist das 78 ?!

achja trotz allem habe ich das ganze hinbekommen... mit dem einzigen problem, dass es in Delphi kein explode (siehe PHP) gibt und das ich nicht weiß an was ich trennen soll, denn den eigentlichen Delimiter vom Server ($00 = nil) musste ich ja ersetzen, da sonst mein Memo auf NIL gesetzt würde... so habe ich mir das thema jetzt auf jeden zusammen gereimt. stelle die tage auch den code dazu hier rein...

das derzeitige problem ist dann nur noch immer nen leeren Listen Port für die Verbindung zu finden aber das krieg ich noch hin Smilie
Hi,

mit dem folgenden Code kann man einen Hex-String in nen Integer umwandeln:

Code DELPHI :
function HexToInt(S : String) : Integer;
var
   I : Integer;
   E : Integer;
begin
     E := 0;
     for I := 0 to Length(S) do
     begin
          E := E * 16 + Ord(S[I]);
          if S[I] in ['0' .. '9'] then
          begin
             E := E - Ord('0');
          end else if S[I] in ['A' .. 'F'] then
          begin
               E := E - Ord('A') + 10;
          end else if S[I] in ['a' .. 'f'] then
          begin
               E := E - Ord('a') + 10;
          end;
     end;
 
     Result := E;
end;


Allgemein, wenn du die Zahl zur Basis b (zum Beispiel 16 für Hex.) hast, dann bekommst du den Wert im Zehnersystem über


N43
also mein Code schaut nun so aus... funktioniert auch super bis auf die Suche nach nem Port die geht leider noch nicht... aber übersetzen etc. hat geklappt...

Code:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,UdpSockUtil, StdCtrls,Winsock,functions;

type
  TForm3 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    rList : TStringList;
    Socket : TUdpSockUtil;
    procedure Recieve(Sender:TObject);
    procedure Error(Sender:TObject;Error:Integer);
    function searchPort(pport:integer) : integer;
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var char : PChar; Port : integer;
begin
Socket := TUdpSockUtil.Create(Form3);
Port := searchPort(10000);
showmessage(IntToStr(port));
Socket.LocalPort := Port;
Socket.OnReceive := Recieve;
Socket.OnError := Error;
Socket.RemoteHost := '85.25.150.117';
Socket.RemotePort := 1725;
Memo1.Clear;
rList := TStringList.Create;
Socket.Listen := true;
end;

function TForm3.searchPort(pPort: Integer) : integer;
var port : integer; Socket : TUdpSockUtil;
begin
  Socket := TUdpSockUtil.Create(nil);
  port := pPort;
  try
    socket.LocalPort := port;
    Socket.Open;
  except
    port := searchPort(port + 1);
    socket.Free;
  end;
  Socket.Free;
  result := port;
end;

function HexDump(const S: String): String;
  var
    i: Integer;
    buf,buf2 : string;
begin
  Result := '';
  for i := 1 to Length(S) do begin
    Result := Result +IntToHex(Ord(S[i]),2)+#32;
    //if ((i mod 16) = 0) then
      //Result := Result +#13#10;
  end;
end;

function HexStrToStr(s: string) : string;
var
  s2 : string;
begin
  while s <> '' do
  begin
    if Pos(' ', s) <> 0 then
    begin
      s2 := Copy(s, 1, Pos(' ', s)-1);
      s := Copy(s, Length(s2)+2, MaxInt);
    end
    else
    begin
      s2 := s;
      s := '';
    end;

    if(StrToInt('$'+s2) = $00)Then Result := Result + '$00' else
      Result := Result + Chr(StrToInt('$' + s2));
  end;
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
Socket.Close;
end;

procedure TForm3.Recieve(Sender: TObject);
  var
    IP: in_addr;
    Msg: String;
    arr : TSTringdynarray;
    i,z : integer;
    varname,varvalue : string;
begin
  Msg := Socket.ReceiveText(IP);
  Memo1.Lines.Add(HexStrToStr(HexDump(Msg)));
  Memo1.Text := Copy(Memo1.Text,Pos('PiNG',Memo1.Text)+4,length(Memo1.Text));
  arr := Explode('$00',Memo1.Text);
  z := 0;
  for I := 0 to High(arr) div 2 do
    begin
    varname := arr[z];
    inc(z);
    varvalue := arr[z];
    if (varname <> '') AND (varvalue <> '') then  
      Form3.rList.Add(varname +'='+varvalue);
    inc(z);
    end;
  Memo1.Text := rList.Text;
end;


procedure TForm3.Button1Click(Sender: TObject);
var query : shortstring;
begin
  Socket.SendText(#$FE#$FD#$00+'PiNG'+#$FF#$00#$00);
  //Memo1.Lines.Add('Anfrage gesendet');
end;

procedure TForm3.Error(Sender: TObject; Error: Integer);
begin
  Memo1.Lines.Add(IntToStr(Error));
end;

end.

Referenz-URLs