你正在做一個奇怪的組合字符串和整數。您可以打包繩線的無符號整數這樣的:
>>> import struct
>>> field2 = '255.255.255.0'
>>> struct.pack('4B',*tuple(int(x) for x in field2.split('.')))
'\xff\xff\xff\x00'
考慮到這一點,你可能想要做的是一樣的東西:
from itertools import chain
f2_int = map(int,field2.split('.'))
f4_int = map(int,field4.split('.'))
struct.pack('L4BL4B',*chain([field1],f2_int,[field3],f4_int))
演示:
>>> import struct
>>> field1 = 1
>>> field2 = '255.255.255.0'
>>> field3 = 20
>>> field4 = '192.168.0.1'
>>> from itertools import chain
>>> f2_int = map(int,field2.split('.'))
>>> f4_int = map(int,field4.split('.'))
>>> struct.pack('L4BL4B',*chain([field1],f2_int,[field3],f4_int))
'\x01\x00\x00\x00\xff\xff\xff\x00\x14\x00\x00\x00\xc0\xa8\x00\x01'
由於事實證明,我可能會在這裏重新發明輪子。您也可能想要查看socket.inet_aton
,看起來它會像您所說的那樣將您的IP地址正確打包爲32位。
小心,最後一行中的'='用一個元組代替'struct.pack'函數! – 2013-02-18 03:22:28