文字列と整数のパッキングの奇妙な組み合わせを行っています。次のように、文字列を符号なし整数としてパックできます。
>>> 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ビットに適切にパックするように見えるものをチェックしたいかもしれません。