Найти - Пользователи
Полная версия: Кодирование ip адреса кодировкой base 10
Начало » Python для новичков » Кодирование ip адреса кодировкой base 10
1 2
Jeck290
Подскажите , не могу понять как написать формулу на питоне

67.222.132.196
67 x (256)3 + 222 x (256)2 + 132 x (256)1 + 196 = 1138656452

пишу

def base10ip(ip="0.0.0.0"):
partip = ip.split(".")
return int(partip[0]) * (256)%3 + int(partip[1]) * (256)%2 + int(partip[2]) * (256)%1 + int(partip[3])
Budulianin
Jeck290
int(partip) * (256)%3 + int(partip) * (256)%2 + int(partip) * (256)%1 + int(partip)

int(partip[0]) * 256 ** 3 + int(partip[1]) * 256 ** 2 + int(partip[2]) * 256 ** 1 + int(partip[3])
o7412369815963
Budulianin
int(partip) * 256 ** 3
или использовать сдвиг
int(partip[0])<<24

вот ещё вариант:
reduce(lambda a,b:(a<<8)+int(b), partip, 0)
Budulianin
o7412369815963
вот ещё вариант:
reduce(lambda a,b:(a<<8)+int(b), partip, 0)

Круто
Jeck290
Да действительно работает ! Но по какой логике сделать декодирование ip адреса обратно ?
Budulianin
Jeck290
Да действительно работает ! Но по какой логике сделать декодирование ip адреса обратно ?

Например
ip_num = 1138656452
ip_num_copy = 1138656452
ip = []
ip_slice = 0
count = 0
while ip_num > (1 << 8):
    while ip_num_copy > (1 << 8):
        count += 1 
        ip_num_copy = ip_num_copy >> 8
        ip_slice = ip_num_copy
	
    ip_num = ip_num_copy = ip_num - (ip_slice << (8 * count))
    ip.append(str(ip_slice))
    count = 0
ip.append(str(ip_num))
print '.'.join(ip)
Jeck290
Спасибо , но одно не ясно что это за сдвиги такие , где за них можно почитать ?
Budulianin
Jeck290
Спасибо , но одно не ясно что это за сдвиги такие , где за них можно почитать ?

Это битовые сдвиги

http://ru.wikipedia.org/

http://server.179.ru/tasks/python/2014b1/22-bits.html

можешь заменить >> 8 на // 256 тоже самое, а << 8 на * 256
sergeek
def decode(ip):
    def orders(n):
        xs, x = divmod(n, 256)
        return [x] + orders(xs) if x else []
    return '.'.join(map(str, reversed(orders(ip))))
alrusdi
Старайтесь же использовать стандартные модули для стандартных задач

from socket import inet_aton, inet_ntoa
from struct import unpack, pack
def ip2int(ip_addr):
    return unpack("!L", inet_aton(ip_addr))[0]
def int2ip(ip):
    return inet_ntoa(pack("!L", ip))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB