2014-01-06 15 views
6

我正在編寫一個腳本將IP轉換爲HEX。下面是我的腳本:通過Python將IP轉換爲十六進制

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 

我的問題是,對於IP像115.255.8.97,我得到這個:

答案來:73FF861

預計答:73FF0861

人聰明到足以告訴我我犯了什麼錯誤。

回答

12

hex函數沒有填充前導零。

>>> 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

由於六角不要」噸有領先的前導零,您可以使用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 

我們正在採取的十六進制數只有[2:](除去加「0x」),然後如果需要的話,我們只是添加2個前導零。

輸出示例:

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到十六進制轉換輸出中,如果輸出以'0'開始。 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)會將一個十六進制轉換爲IP,ip2bin(ip​​)會將IP轉換爲bin,ip2hex(ip)會將IP轉換爲十六進制 – user2968981