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
socket.htons und struct.pa
-
- 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.
"\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.
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
Code: Alles auswählen
>>> struct.pack('!i', 1)
'\x00\x00\x00\x01'
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,)
Hoffe das hilft
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
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