Seite 1 von 1
socket.htons und struct.pa
Verfasst: Dienstag 28. Juni 2011, 19:06
von homi
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
Re: socket.htons und struct.pa
Verfasst: Dienstag 28. Juni 2011, 23:20
von Dauerbaustelle
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.
"\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
Re: socket.htons und struct.pa
Verfasst: Dienstag 5. Juli 2011, 13:56
von mkiever
Wenn das Format mit '!' beginnt, übersetzt struct.pack/unpack korrekt in/von Netzwerk Byteorder,
entspricht dann also den Funktionen htons, htonl ...
Grüße,
Matthias.
Re: socket.htons und struct.pa
Verfasst: Mittwoch 6. Juli 2011, 12:30
von mkiever
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