AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Query an Gameserver
Thema durchsuchen
Ansicht
Themen-Optionen

Query an Gameserver

Ein Thema von Flodding · begonnen am 18. Feb 2015 · letzter Beitrag vom 1. Nov 2015
Antwort Antwort
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#1

AW: Query an Gameserver

  Alt 22. Feb 2015, 12:16
Die ID : 8A84 sollte umgewandelt 33930 ergeben. Tut es aber nicht egal in was ich umwandel. HextoStr gibt Kryptisches, HextoInt gibt eine falsche Zahl: 35460.
Das sagt mir, dass Du nie versucht hast 33930 in ein Hex umzuwandeln, denn dann hättest Du gesehen , dass 33930 ToHex-> 848A ist.

Na, fällt Dir etwas auf?
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Query an Gameserver

  Alt 22. Feb 2015, 12:18
ja das habe ich natürlich probiert...

von SIGNED INT to HEX funktionierts ja auch.

aber von HEX to SIGNED INT häng ich. ich bekomms nur in INT gewandelt und das gibt dann den falschen wert.
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Query an Gameserver

  Alt 22. Feb 2015, 13:17
Es ist erheblich einfacher als du denkst, aber du musst eben etwas umdenken

Zunächst einmal schaust du dir die Datentypen an, die Valve da vorgibt und suchst dir die passenden Delphi-Typen dazu heraus
http://docwiki.embarcadero.com/RADSt...Der_Typ_Single

Dann könnte man das hier bauen
Delphi-Quellcode:
type
  TValveByte = Byte; {8 bit character or unsigned integer}
  TValveShort = SmallInt; {16 bit signed integer}
  TValveLong = Integer; {32 bit signed integer}
  TValveFloat = Single; {32 bit floating point}
  TValveLongLong = Cardinal; {64 bit unsigned integer}
Jetzt gibt es in Delphi auch so nette Sachen wie Delphi-Referenz durchsuchenTStream und der kann Delphi-Referenz durchsuchenTStream.WriteData und (viel Spanier hier) Delphi-Referenz durchsuchenTStream.ReadData.

Du bekommst ja eine Handvoll Bytes und die kann man in einen Delphi-Referenz durchsuchenTBytesStream packen und dann liest man ganz gemütlich die Daten heraus.

Hier mal ein kleines Beispiel zum Starten:
Delphi-Quellcode:
const
  SIMPLE_RESPONSE_HEADER : TValveLong = $FFFFFFFF;
  MULTIPACKET_RESPONSE_HEADER : TValveLong = $FFFFFFFE;

procedure Foo( AResponse : TBytes );
var
  LResponseStream : TStream;
  LHeader : TValveLong;
begin
  LResponseStream := TBytesStream.Create( AResponse );
  try
    LResponseStream.ReadData( LHeader ); // Wir lesen den 4-Byte Header
    case LHeader of
      SIMPLE_RESPONSE_HEADER :
        WorkOnSimpleResponse( LResponseStream );
      MULTIPACKET_RESPONSE_HEADER :
        WorkOnMultiPacketResponse( LResponseStream );
    else
      raise Exception.CreateFmt( 'Unknown Header Value %8.8x', [LHeader] );
    end;
  finally
    LResponseStream.Free;
  end;
end;
Wie du sehen kannst, vermeide ich auf Teufel komm raus, irgendwo im Quelltext mit Magic Values zu arbeiten.

Wenn irgendein Wert eine bestimmte Bedeutung hat, dann definiert man sich einen Konstante und verwendet diese Konstante im Quelltext. Dann bleibt das auch immer schön lesbar.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Query an Gameserver

  Alt 22. Feb 2015, 13:35
Bist du dir auch sicher, dass [$8A, $84] auch wirklich $8A84 bedeuten oder evtl. eher $848A ?

In der Valve-Dokumentation wird ganz eindeutig von All types are little endian gesprochen, was wiederum bedeutet, dass du dir diese Seite anschauen solltest
http://de.wikipedia.org/wiki/Byte-Re...-Endian-Format

und dann bedeutet diese Bytefolge [$8A, $84] eben genau $848A entspricht was dezimal dann tatsächlich 33930 entspricht. Nur im Speicher sind die Bytes eben in umgekehrter Reihenfolge abgelegt.

Darauf achten musst du nicht, wenn du diese Werte (wie in meinem Beitrag zuvor gezeigt) direkt aus dem Stream liest (lese einfach eine SmallInt , bzw. Int16 )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#5

AW: Query an Gameserver

  Alt 22. Feb 2015, 14:27
Die ID : 8A84 sollte umgewandelt 33930 ergeben. Tut es aber nicht egal in was ich umwandel. HextoStr gibt Kryptisches, HextoInt gibt eine falsche Zahl: 35460.
Das sagt mir, dass Du nie versucht hast 33930 in ein Hex umzuwandeln, denn dann hättest Du gesehen , dass 33930 ToHex-> 848A ist.

Na, fällt Dir etwas auf?

und dann bedeutet diese Bytefolge [$8A, $84] eben genau $848A entspricht was dezimal dann tatsächlich 33930 entspricht. Nur im Speicher sind die Bytes eben in umgekehrter Reihenfolge abgelegt.
Vielleicht fällt es ihm jetzt auf, wenn er das 2. mal mit der Nase darauf gestoßen wird.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Query an Gameserver

  Alt 22. Feb 2015, 18:39
Vielleicht fällt es ihm jetzt auf, wenn er das 2. mal mit der Nase darauf gestoßen wird.
Ja ist es jetzt.
Aber ich muss dazu sagen, dass es kaum möglich ist, diskreter darauf hinzuweisen.

Man schaue sich "8A84" und "848A" nur mal an.
Ich möchte nicht unhöflich klingen, aber man hätte mich einfach direkt drauf hinweisen können OHNE zu warten und sich dann lustig drüber zu machen.
Ich bin sehr dankbar für die Hilfe die mir hier angeboten wird und interpretiere sie auch nicht als lästiges Rumgedruckse oder Ähnliches. Indirekt / eloquent jemanden zu beleidigen ist trotzdem nicht die feine Art und ich bitte dies in Zukunft zu unterlassen. Sicher hätte ich dem preventieren können wenn ich wie der Fuchs aufgepasst hätte. Wir stempeln das als meinen Fehler ab

Soviel zum Offtopic!

Delphi kennt TBytes bei mir nicht.
procedure Foo( AResponse : TBytes ); Des Weiteren verstehe ich am Beispiel noch nicht so ganz, wie ich unbekannten Inhalt erkennen soll. Das mit dem Header war ja nun leicht weil er bekannt ist.
Flo
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: Query an Gameserver

  Alt 22. Feb 2015, 19:19
Man schaue sich "8A84" und "848A" nur mal an.
Ich ICH ich

Man sieht sofort den Unterschied, da es in der Muttersprache geschrieben steht.

"8A84" und "848A"

Man sieht sofort den Unterschied, wenn man sich mit der Sprache beschäftigt, also hier sich die hexadezimale Schreibweise zu Eigen gemacht hat.

Und diese Schreibweise kommt in der Computerwelt an jeder Stelle um die Ecke.


Man schaue sich "8A84" und "848A" nur mal an.
Ich möchte nicht unhöflich klingen, aber man hätte mich einfach direkt drauf hinweisen können OHNE zu warten und sich dann lustig drüber zu machen.
Das war nicht meine Absicht, zeigt mir aber, wie so oft, dass Antworten leider von den Fragestellern nicht richtig angeschaut werden.

Wir können Dir auch das Programm komplett schreiben, aber wo wäre da der Lerneffekt.

Wenn Du also das nächste mal mit einer Antwort etwas nicht anfangen kannst, dann frage doch nochmals nach, dann sehen wir auch, ob Du es verstanden hast oder nicht.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz