Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2013 23:59:36

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

Подскажите , не могу понять как написать формулу на питоне

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



Отредактировано Jeck290 (Окт. 13, 2013 00:16:48)

Офлайн

#2 Окт. 13, 2013 01:30:55

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

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



Отредактировано Budulianin (Окт. 13, 2013 01:31:51)

Офлайн

#3 Окт. 13, 2013 11:41:33

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

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

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

Отредактировано o7412369815963 (Окт. 13, 2013 11:53:29)

Офлайн

#4 Окт. 13, 2013 13:04:26

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

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

Круто



Офлайн

#5 Окт. 13, 2013 19:12:48

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

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



Офлайн

#6 Окт. 13, 2013 23:04:57

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

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)



Офлайн

#7 Окт. 14, 2013 08:39:42

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

Спасибо , но одно не ясно что это за сдвиги такие , где за них можно почитать ?



Офлайн

#8 Окт. 14, 2013 09:40:40

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

Jeck290
Спасибо , но одно не ясно что это за сдвиги такие , где за них можно почитать ?

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

http://ru.wikipedia.org/

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

можешь заменить >> 8 на // 256 тоже самое, а << 8 на * 256



Отредактировано Budulianin (Окт. 14, 2013 09:44:52)

Офлайн

#9 Окт. 14, 2013 11:29:57

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

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

Отредактировано sergeek (Окт. 14, 2013 11:34:48)

Офлайн

#10 Окт. 14, 2013 11:56:28

alrusdi
Зарегистрирован: 2013-09-30
Сообщения: 20
Репутация: +  8  -
Профиль   Отправить e-mail  

Кодирование ip адреса кодировкой base 10

Старайтесь же использовать стандартные модули для стандартных задач

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version