socket.htons und struct.pa

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
homi
User
Beiträge: 1
Registriert: Dienstag 28. Juni 2011, 18:43

Hallo,

ich habe ein kleines Verständnisproblem mit der Netzwerkbyteorder bzw. dem struct-Modul.

Per socket.htons bzw. socket.htonl kann man numerische Werte nach Big-Endian konvertieren.

Kann man das auch per struct.pack machen?

htons/htonl liefern int/long-Werte. Die pack-Funktion einen string.

Irgendwie kann ich das nicht richtig zuorden. Wann benutzt man denn welche Funktionen?

homi
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Mit `struct.pack` kannst du Python-Datentypen (Integer z.B.) in "echte" Binärdarstellung konvertieren, also in Bytes. Drum gibt das auch einen Bytestring zurück.

Code: Alles auswählen

>>> struct.pack('!i', 1)
'\x00\x00\x00\x01'
"\x..." ist die Python-Darstellung für Nicht-ASCII-Bytes in Strings. "\x00\x00\x00\x01" entspricht binär 00000000 00000000 00000000 00000001.

Du kannst das, was `htons/l` machen auch mit `struct.pack` und `struct.unpack` (die Umkehrfunktion von `pack`, nimmt also einen Bytestring und macht Python-Typen draus) nachbauen, indem du erst die Python-Daten nimmst, `struct.pack`st und dann in umgekehrter Reihenfolge wieder auspackst.

Code: Alles auswählen

>>> socket.htonl(15)
251658240L
>>> struct.unpack('!i', struct.pack('i', 15))
(251658240,)
Das ist aber nicht platformunabhängig wenn ich das richtig weiß, weil nicht auf allen Systemen die Byteorder andersrum ist wie Netzwerkbyteorder. Deswegen dafür immer schön die Socket-Sachen nutzen. :-)

Hoffe das hilft
mkiever
User
Beiträge: 19
Registriert: Mittwoch 4. März 2009, 18:06
Wohnort: Braunschweig

Wenn das Format mit '!' beginnt, übersetzt struct.pack/unpack korrekt in/von Netzwerk Byteorder,
entspricht dann also den Funktionen htons, htonl ...
Grüße,
Matthias.
mkiever
User
Beiträge: 19
Registriert: Mittwoch 4. März 2009, 18:06
Wohnort: Braunschweig

Ach ja, die Frage nach, wann benutzt man was:
htons/htonl etc. wenn man int/long etc. braucht.
struct wenn man bytes braucht.
Daten versenden/empfangen ist mit struct einfacher, da man keinen weiteren Schritt
braucht.
htons/htonl etc. würde man zum Beispiel benutzen, um struct zu implementieren.

Grüße,
Matthias Kievernagel
Antworten