我正在编写一个将IP转换为HEX的脚本。以下是我的剧本:
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
任何人都可以聪明地告诉我我犯了什么错误。
答案 0 :(得分:13)
hex
函数没有填充前导零。
>>> hex(8).replace('0x', '')
'8'
将str.format
与02X
格式规范一起使用:
>>> '{: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'
答案 1 :(得分: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])
答案 2 :(得分:1)
series: [{
name: 's1',
data: [10, 10, 10, 10, 10, 10]
}, {
name: 's2',
data: [1, 1, 1, 1, 1, 1]
}, {
name: 's3',
data: [-2, -2, -2, -2, -2, -2],
enabledMouseTracking: false,
color: 'none'
}]
答案 3 :(得分:0)
从python v3.5开始,您可以这样做:
import socket
socket.inet_aton(ip).hex()
答案 4 :(得分:-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。转换中是否有任何直接方法。