2

Pythonを使用してパケットを作成したいと思います。パケットには、それぞれ32ビットの4つのフィールドがあります。サンプルコードがあります:

import socket, sys, os, struct
field1 = 1
field2 = '255.255.255.0'
field3 = 20
field4 = '192.168.0.1'

struct.pack=('!L4sL4s',field1,field2,field3)

しかし、私には出力がありません。このパケットをフォーマットして、変数ごとに正確に4バイトを使用できるようにするにはどうすればよいですか。

4

4 に答える 4

4
>>> struct.pack('!L4sL4s', field1, socket.inet_aton(field2),
                           field3, socket.inet_aton(field4))
'\x00\x00\x00\x01\xff\xff\xff\x00\x00\x00\x00\x14\xc0\xa8\x00\x01'
于 2013-02-18T03:27:45.343 に答える
3

タプル('!L4sL4s',field1,field2,field3)をに割り当てていますstruct.pack。次のように呼び出す必要がありますstruct.pack:(struct.pack('!L4sL4s',field1,field2,field3,field4)いいえ=記号)。

于 2013-02-18T03:11:29.613 に答える
0

呼び出しの結果packが返され、変数に割り当てることができます。行は次のようになります。

my_packet = struct.pack('!L4sL4s',field1,field2,field3)

この行は、unsigned long int、次に長さ4の文字列、次にlong int、次に長さ4の文字列を想定してfield2おりfield4、どちらもこれより長いことに注意してください。len(field2)たとえば、を使用してどのくらいの長さかを確認してみてください。

于 2013-02-18T03:13:08.810 に答える
0

文字列と整数のパッキングの奇妙な組み合わせを行っています。次のように、文字列を符号なし整数としてパックできます。

>>> 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ビットに適切にパックするように見えるものをチェックしたいかもしれません。

于 2013-02-18T03:17:06.850 に答える