Задать вопрос
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии

Реализация long2ip(). Как конвертировать ip с long в string?

со строки в число конвертирую по формуле
1октет * pow(256, 3) + 2октет * pow(256, 2) + 3октет * pow(256, 1) + 4октет * pow(256, 0)

77.88.21.8
77 * pow(256, 3) + 88 * pow(256, 2) + 21 * pow(256, 1) + 8 * pow(256, 0) = 1297618184.


а наооборот, не могу, с матаном проблемы
1297618184 => 77.88.21.8

если можно просто подсказать, код я уже сам нипишу
  • Вопрос задан
  • 1802 просмотра
Подписаться 3 Оценить 3 комментария
Решения вопроса 2
@Remdev
На сишке примерный код был бы такой

long int x=1297618184;
int oct[4];
for(int i=3;i>=0;i--){
    oct[3-i] = x/pow(256,3);
    x = x%pow(256,3);
}

printf("%d.%d.%d.%d",oct[0],oct[1],oct[2],oct[3]);


p.s. / - целочисленное деление, а % остаток от деления
Ответ написан
@deliro
def ip2int(s):
    	ocs = s.split('.')
    	e = 0
    	res = 0
    		while ocs:
    			    	res += int(ocs.pop()) * 256 ** e
     	   			e += 1
    		return res


def int2ip(i):
    		res = []
    		e = 3
    		while len(res) < 4:
    	    			current = i // (256 ** e)
    	    			res.append(str(current))
    	    			i -= current * (256 ** e)
    	    			e -= 1
    		return '.'.join(res)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@throughtheether
human after all
Если хотите изобретать велосипед, по при помощи модуля struct запакуйте 32-битное значение в строку и распакуйте результат как 4 байта.

Если хотите решить задачу без излишних усилий, можете воспользоваться модулем netaddr:
>>> import netaddr
>>> int(netaddr.IPAddress('77.88.21.8'))
1297618184
>>> str(netaddr.IPAddress(1297618184))
'77.88.21.8'


UPD:
у меня была задача именно самому выполнить эти преобразования,
Держите тогда два модных однострочника:
def long_to_dotted_decimal(val):
    return '.'.join(map(str,[val%256**idx/256**(idx-1) for idx in xrange(4,0,-1)]))

def dotted_decimal_to_long(strval):
    return sum(map(lambda (power,octet):256**power*int(octet),enumerate(reversed(strval.split('.')))))

Пример использования:
>>> long_to_dotted_decimal(dotted_decimal_to_long('127.0.0.1'))
'127.0.0.1'
>>> long_to_dotted_decimal(dotted_decimal_to_long('255.255.255.255'))
'255.255.255.255'
>>> long_to_dotted_decimal(1297618184)
'77.88.21.8'
>>> dotted_decimal_to_long('77.88.21.8')
1297618184
Ответ написан
sivabur
@sivabur
Заблокировали просто так!
1297618184/ pow(256, 3) + . + 1297618184 * pow(256, 2) + . + 1297618184/ pow(256, 1) + . + 1297618184/ pow(256, 0)
Ответ написан
Комментировать
2ord
@2ord
Нужно получить октеты из 4-хбайтного числа, сконвертировать октеты в строковое представление в десятичной системе исчисления и соединить строки точками.
Ответ написан
Комментировать
HarpyWar
@HarpyWar
function ip2long($ipstr)
{
	$ip = explode('.', $ipstr);
	$ipl32 = ($ip[0] << 24) + ($ip[1] << 16) + ($ip[2] << 8) + $ip[3];
	return $ipl32;
}

function long2ip($ipl32)
{
	$ip[0] = ($ipl32 >> 24) & 255; 
	$ip[1] = ($ipl32 >> 16) & 255; 
	$ip[2] = ($ipl32 >> 8) & 255; 
	$ip[3] = $ipl32 & 255; 
	$ipstr = implode('.', $ip);
	return $ipstr;
}


Для PHP эти функции уже есть. Для Python тоже:
www.php2python.com/wiki/function.ip2long
www.php2python.com/wiki/function.long2ip
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы