Преобразование IP в Hex с помощью Python

Я пишу сценарий для преобразования 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

моя проблема в том, что для IP, как 115.255.8.97, я получаю это:

ответ : 73FF861

ожидаемый Ans: 73FF0861

может ли кто-нибудь достаточно умен, чтобы сказать мне, какую ошибку я делаю.

5 ответов


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'

поскольку hex не имеет ведущих ведущих нулей, вы можете использовать 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])

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

начиная с python v3.5 Вы можете просто сделать:

import socket
socket.inet_aton(ip).hex()

https://docs.python.org/3/library/stdtypes.html#typebytes


>>>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 ' ex. 0aff0861 затем я хочу удалить 0, и выход должен выглядеть как aff0861. Существует ли какой-либо прямой метод преобразования.