Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PHP to Delphi: pack() / unpack(); (https://www.delphipraxis.net/141853-php-delphi-pack-unpack-%3B.html)

xSkaschY 17. Okt 2009 17:07


PHP to Delphi: pack() / unpack();
 
Liste der Anhänge anzeigen (Anzahl: 1)
N'Abend zusammen,

Versuche gerade einen PHP in Delphi zu kopieren, jedoch scheitere ich an der pack(); mathode von PHP.

Folgend der PHP Code:

Code:
$sOutput = pack(
   "nvCCCCv",
   $this->wMagic,
   $this->wHash,
   $this->byVersion,
   $this->byPacketType,
   $this->byRequestType,
   $this->byUnknown0x00,
   $this->wFieldCount
);
Ich habe es nach einschlägiger Suche mal so probiert:

Delphi-Quellcode:
  rData := TStringStream.Create('');
  try
    rData.Position:= 0;

    rData.Write(rPacketHeader.wMagic, SIZEOF(WORD));
    rData.Write(rPacketHeader.wHash, SIZEOF(WORD));
    rData.Write(rPacketHeader.byVersion, SIZEOF(BYTE));
    rData.Write(rPacketHeader.byPacketType, SIZEOF(BYTE));
    rData.Write(rPacketHeader.byUknown0x00, SIZEOF(BYTE));
    rData.Write(rPacketHeader.wFieldCount, SIZEOF(WORD));

    if rPacketHeader.byPacketType = AA3_PACKET_TYPE_FRAGMENTED_RESPONSE then begin
      rData.Write(rPacketHeader.wOrder, SIZEOF(WORD));
      rData.Write(rPacketHeader.wTotal, SIZEOF(WORD));
    end;

    Result := rData.DataString + rPacketHeader.sData;
  finally
    rData.Free;
  end;
Aber in PHP habe ich 31 Byte, in delphi nur 30... da fehlt ein Byte! :(

Und auch der Binary String ist komplett anders:

PHP etwa: "J5ÿÿ���i<aCg+<QlMB Qn0m"

In Delphi bekomme ich nur ein "5Jÿÿ" in des TMemo.


Anbei wie das fertige Paket "ausschauen" soll.


Wie komme ich nu weiter?


LG Toby

jfheins 17. Okt 2009 17:17

Re: PHP to Delphi: pack() / unpack();
 
Du hast ja auch das eine Byte vergessen:

Byte - Unknown, appears to always have the value 0x00

xSkaschY 17. Okt 2009 23:05

Re: PHP to Delphi: pack() / unpack();
 
Hallo,

danke für deine Antwort.

Du hast recht, ich hab die Procedure Argumente etwas durcheinander gebracht. Besten dank! :)

xSkaschY 17. Okt 2009 23:18

Re: PHP to Delphi: pack() / unpack();
 
Irgendwie kommt aber immernoch nicht das richtige zustande.

Wie kann ich mir den Binary String den mal anzeigen lassen?

ShowMessage oder ein TMEmo lässt die hälfte raus.

LG

Valle 17. Okt 2009 23:22

Re: PHP to Delphi: pack() / unpack();
 
Speicher es in eine Datei und öffne sie mit einem Bei Google suchenHexeditor. ;-)

Liebe Grüße,
Valle

xSkaschY 18. Okt 2009 00:01

Re: PHP to Delphi: pack() / unpack();
 
Also irgendwas läuft da falsch...


PHP Binary String:

4A35FFFF023F023F013F693C176143671F2B3C516C4D420B51 7F026E1E306D


Delphi Binary String

4CAA7202E0F41700020E470024F81700180E4700E0F4170030 7068022C876F


Obwohl die gleichen Daten übergeben werden. Also scheint irgendwas mit dem "pack()" nicht zu stimmen.

Hier mal eine übersicht was mein Ziel ist:

AAO3 Server UDP Query

wicht 18. Okt 2009 00:15

Re: PHP to Delphi: pack() / unpack();
 
Moin,
ich bin zwar schon gut angetrunken und bin mir nicht sicher ob es hilft, aber da, wo ich mal pack() benutzt habe, habe ich den Variablen noch einen Typecast mitgegeben. Bei PHP kann man sich glaube ich nie so sicher sein, was was ist.... Naja ich hasse PHP.. bitte nicht hauen :)

xSkaschY 18. Okt 2009 00:17

Re: PHP to Delphi: pack() / unpack();
 
Nunja :-) Wie soll ich sagen. In PHP funktioniert es ja ;) Nur Delphi mag es nicht!

Ich hab die Problematik eher andersrum :D Bitte nicht hauen! :)

Valle 18. Okt 2009 00:26

Re: PHP to Delphi: pack() / unpack();
 
Eventuell musst du die Endianness umstellen. Wie das genau geht steht auf der Dokumentationsseite der PHP-Funktion. Was du brauchst ist little Endian, zumindest wenn Delphi das nicht irgendwie ändern sollte. :gruebel:

Liebe Grüße,
Valle

xSkaschY 18. Okt 2009 00:34

Re: PHP to Delphi: pack() / unpack();
 
folgende "endianness" werden benötigt:

vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge Big Endian)
vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge Little Endian)
vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge Little Endian)
vorzeichenloses Zeichen

Code:
$sOutput = pack(
   "nvCCCCv",
   $this->wMagic,
   $this->wHash,
   $this->byVersion,
   $this->byPacketType,
   $this->byRequestType,
   $this->byUnknown0x00,
   $this->wFieldCount
);
Code:
n = Magic
v = Hash
C = Version
C = PacketType
C = RequestType
C = Unkown 0x00 ($00)
v = FieldCount

----

n = vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge Big Endian)
v = vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge Little Endian)
C = vorzeichenloses Zeichen

an anderer Stelle noch

V = vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge Little Endian)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr.
Seite 1 von 3  1 23      

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