2017-01-15 9 views
1

socket.inet_aton組み込みメソッドを使用せずに、自分のstruct.pack固有の機能を実装して、IP文字列(つまり、 "192.168.0.1")を32ビットのパック値にパックする機能が必要です。 Python pack IP文字列

は、私がこれまでに得た:

ip = "192.168.0.1" 
hex_list = map(hex, map(int, ip.split('.'))) 
# hex list now is : ['0xc0', '0xa8', '0x0', '0x01'] 

私の質問は:? は、どのように私はそれ['0xc0', '0xa8', '0x0', '0x01']から'\xc0\xa8\x00\x01'から入手できますか、(これは私がsocket.inet_aton(ip)

から取得していますものですまた、 - その文字列の中央にNUL(\x00)があるのはどうですか?\x形式の理解が不足していると思います

答えて

0

代替:

あなたはipaddressto_bytes(のpython 3.2)使用することはできますか?

>>> import ipaddress 
>>> address = ipaddress.IPv4Address('192.168.0.1') 
>>> address_as_int = int(address) 
>>> address_as_int.to_bytes(4, byteorder='big') 
b'\xc0\xa8\x00\x01' 

実際には整数だけが必要な場合があります。

は明らかに短くなりますが、あなたが好きなようにあなたはフォーマットに文字列の内包表記を使用することができ、すべてのステップを表示することが明らかに:)

+0

ありがとうございました! –

1

を望んでいたことができます:

ip = "192.168.0.1" 
hex_list = map(int, ip.split('.')) 
hex_string = ''.join(['\\x%02x' % x for x in hex_list]) 

または1つのライナーとして:

hex_string = ''.join(['\\x%02x' % int(x) for x in ip.split('.')]) 
+0

私はそれを試みましたが、 '\ xc0 \ xa8 \ x00 \ x01'と等しくない '\\ xc0 \\ xa8 \\ x00 \\ x01'を取得します。それは同じですか? –

+0

'\\'はあなたに単一の '\'を示すPythonの方法です。 「\\ x%02x」を 'r '\ x%02x''に変更し、同じ結果を得ることに注意してください。 –

+0

私はそれを知っていますが、私はこのアドレスを送ると同じでしょうか? 'socket.inet_aton'で受け取った値と同じになるのでしょうか? –