2014-01-06 6 views
6

IPをHEXに変換するスクリプトを書いています。以下は私のスクリプトです:IPを16進数でPythonに変換する

import string 
ip = raw_input('Enter IP') 
a = ip.split('.') 
b = hex(int(a[0])) + hex(int(a[1])) + hex(int(a[2])) + hex(int(a[3])) 
b = b.replace('0x', '') 
b = b.upper() 
print b 

私の問題は、115.255.8.97のようなIPのために、私はこの取得していますということです:来る

回答:73FF861

予想される回答:73FF0861

は誰にもできます私が間違っていることを教えてくれるほど巧妙です。

答えて

12

hex関数は先頭に0を付けません。

>>> hex(8).replace('0x', '') 
'8' 

使用str.format02X形式の仕様と:

>>> '{:02X}'.format(8) 
'08' 
>>> '{:02X}'.format(100) 
'64' 

>>> a = '115.255.8.97'.split('.') 
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*map(int, a)) 
'73FF0861' 

または使用することができますbinascii.hexlify + socket.inet_aton

>>> import binascii 
>>> import socket 
>>> binascii.hexlify(socket.inet_aton('115.255.8.97')) 
'73ff0861' 
>>> binascii.hexlify(socket.inet_aton('115.255.8.97')).upper() 
'73FF0861' 
+0

これは非常によく見えます。 raw_input()への入力として複数の行を入力できる方法はありますか? – user2922822

+0

@ user2922822、すべての行を取得するために 'sys.stdin'を反復することができます。または、 'raw_input()'を繰り返す。 – falsetru

1

進ドン以降」 tはあなたが我々が(「0X」を削除)のみ[2:]で進数を取っているし、必要であれば、我々は2つの先行ゼロのみを追加しているzfill(2)

import string 
ip = raw_input('Enter IP') 
a = ip.split('.') 
b = hex(int(a[0]))[2:].zfill(2) + hex(int(a[1]))[2:].zfill(2) + hex(int(a[2]))[2:].zfill(2) + hex(int(a[3]))[2:].zfill(2) 
b = b.replace('0x', '') 
b = b.upper() 
print b 

を使用することができ、先頭のゼロをリードしています。

出力例:

Enter IP 192.168.2.1 
C0A80201 

出力例:

Enter IP 115.255.8.97 
73FF0861 

EDIT1:

@volcano要求することによって、あなたがリストの内包表記で置き換えることができます。

b = "".join([hex(int(value))[2:].zfill(2) for value in a]) 
+0

うわー、あなたは本当にこれをすべて入力しました>リストの理解はどうですか? – volcano

+0

@ volcano私はコメントを受け入れ、答えは編集されました。 –

-1
>>>import binascii 
>>>import socket 
>>>binascii.hexlify(socket.inet_aton('115.255.8.97')) 
'73ff0861' 
>>>binascii.hexlify(socket.inet_aton('10.255.8.97')) 
'0aff0861' 

上記のIP〜16進変換出力では、出力が「0」で始まる場合はex。 0aff0861その後、私は0を削除し、出力はaff0861のようになります。変換には直接的な方法がありますか?

+0

コメントをあなたのコメントに入れてもらえますか?問題は回答として誤解を招くことです。 (少なくとも私は誤解していた;) – tssch

0
import socket, struct 

# Convert a hex to IP 
def hex2ip(hex_ip): 
    addr_long = int(hex_ip,16) 
    hex(addr_long) 
    hex_ip = socket.inet_ntoa(struct.pack(">L", addr_long)) 
    return hex_ip 

# Convert IP to bin 
def ip2bin(ip): 
    ip1 = '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')]) 
    return ip1 

# Convert IP to hex 
def ip2hex(ip): 
    ip1 = '-'.join([hex(int(x)+256)[3:] for x in ip.split('.')]) 
    return ip1 

print hex2ip("c0a80100") 
print ip2bin("192.168.1.0") 
print ip2hex("192.168.1.0") 
+2

裸のコードの回答を与えないでください。また、コードが何をしているのかについての説明も提供します。 –

+0

hex2ip(hex_ip)は16進数をIPに変換し、ip2bin(ip​​)はIPをbinに変換し、ip2hex(ip)はIPを16進数に変換します – user2968981

関連する問題