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
TStream und der kann
TStream.WriteData und (viel Spanier hier)
TStream.ReadData.
Du bekommst ja eine Handvoll Bytes und die kann man in einen
TBytesStream 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.