Übertragung von einigen Bytes (Codierung)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Hallo zusammen,

mittels einer TCP-Verbindung muss ich Daten eines Programms auslesen. Damit das Programm die Anfragen versteht, müssen bestimmte Bytes übertragen werden, in Intel-Order übertragen werden. Das Beispieltool ist in Delphi realisiert und macht das wie folgt:
Chr($00)+Chr($01)
zur Übertragung von 00 01

Wie kann ich das in Python realisieren? Leider reagiert das Programm nicht auf

Code: Alles auswählen

s.send("\x00\x01")
Ich weiß zwar, dass was übertragen wird, aber die Kodierung scheint nicht zu stimmen? Jemand eine Idee, wo man ansetzen könnte mit der Suche nach Ideen???

Danke
Galdo
BlackJack

Also die Daten sollten stimmen. Es muss also an etwas anderem liegen. Werden die Daten wirklich gesendet oder liegen die vielleicht noch beim Sender in einem Puffer?
galdo
User
Beiträge: 12
Registriert: Montag 19. November 2007, 10:03

Ich hab nochmal ein wenig nachgeforscht, und zwar folgendes:

Das Programm erwartet Daten vom Typ Cardinal (in Delphi), das entspricht einem UInt32 (also eigentlich einem 4Byte-Wert). Ich hab nochmal das komplette Delphi-Testprogramm angehängt:

Code: Alles auswählen

 s := Chr($00)+Chr($01);
s := s + Chr($02);
s := s + Chr($03);
ident := 'Test';
s := s + Chr(Length(ident));
s := s + ident

// gesamte Paketlänge
card := Length(s);
PCardinal(@FArray)^:=card;

// intel-order
for a:=3 downto 0 do s:=Chr(FArray[a]) + s;

// sende s...
Ich vermute, dass bei mir die Ermittlung der Gesamtlänge schief geht. Das Protokoll ist nicht sonderlich spannend, erwartet aber vom Aufbau her:
4Byte: Packetlänge
2Byte: 00 01
1Byte: 02
1Byte: 03
beliebig: identification mit dem ersten Byte = Länge der ID

Beispielsweiße würde es so aussehen:

00 00 00 39 00 01 02 03 4Test

Allerdings ist mir nicht ganz klar, wie ich vor allem auch den ID Teil codieren soll?

in Ascii wäre 4Test ja:
34 54 65 73 74

=>

00 00 00 39 00 01 02 03 34 54 65 73 74

wobei 39 der 9 (Hex) entspricht!

Danke nochmals für eure Infos

Galdo
BlackJack

Die Länge sollte wohl kaum ein 0x39 enthalten, denn das Paket ist ja nicht 57 Bytes lang sondern nur 9 Bytes.

Die Daten selbst kann man in Python im Grunde genau so zusammen setzen wie in Pascal. Die Paketlänge lässt sich mit `struct.pack()` in vier Bytes umwandeln:

Code: Alles auswählen

In [82]: identifier = 'Test'

In [83]: data = '\x00\x01\x02\x03' + chr(len(identifier)) + identifier

In [84]: data = struct.pack('>I', len(data)) + data

In [85]: data
Out[85]: '\x00\x00\x00\t\x00\x01\x02\x03\x04Test'
Antworten