PDA

Показать полную графическую версию : [решено] Вот как вычислить IP


McLotos
29-01-2014, 22:25
Долго ломал голову, и никак не додумаюсь
Вот смотрите:
2552552 = 0.38.242.232
25525520 = 1.133.125.16
255255200 = 15.54.226.60
2552552000=152.36.218.64
Хотя всё очень легко, допустим имеется адрес 61.130.212.100, нужно представить его в виде числа
61 умножить на 256 в кубе = 1023410176
130 умножить на 256 в квадрате = 8519680
212 умножить на 256 = 54272
ну а 100 мы так и оставим
посчитаем сумму полученных значений
1023410176+8519680+54272+100 = 1031984228 = 61.130.212.100
А вот как провести обратные расчеты? ну из числа получить IP

DedAlex
29-01-2014, 23:08
Обратно тому что вы написали.

2552552000/256^3=152 отбрасываем дробную часть
2552552000-152*256^3=2415168
2415168/256^2=36
2415168-36*256^2=55872
55872/256=218
55872-218*256=64

McLotos
29-01-2014, 23:48
DedAlex, спасибо, как-то я не сообразил.

McLotos
30-01-2014, 14:19
В общем чтобы каждый раз так не считать (а то взрыв мозга можно заработать), написал скриптик
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>

$BGUI=GUICreate("Шифровка IP",200,55)
GUISetState(@SW_SHOW)
$octet1 = GUICtrlCreateInput("",10,5,30,20,$ES_NUMBER)
GUICtrlSetLimit(-1, 3)
$octet2 = GUICtrlCreateInput("",40,5,30,20,$ES_NUMBER )
GUICtrlSetLimit(-1, 3)
$octet3 = GUICtrlCreateInput("",70,5,30,20,$ES_NUMBER )
GUICtrlSetLimit(-1, 3)
$octet4 = GUICtrlCreateInput("",100,5,30,20,$ES_NUMBER )
GUICtrlSetLimit(-1, 3)
$button1 = GUICtrlCreateButton("Расчитать",130,5,60,20)
$code=GUICtrlCreateInput("",10,30,120,20,$ES_NUMBER)
$button2 = GUICtrlCreateButton("Расчитать",130,30,60,20)
GUICtrlSetLimit(-1, 10)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $button1
MsgBox(0,'Результат',GUICtrlRead($octet1)*256*256*256+GUICtrlRead($octet2)*256*256+GUICtrlRead($octe t3)*256+GUICtrlRead($octet4))
Case $button2
$octet1=StringLeft(GUICtrlRead($code)/256/256/256, StringInStr(GUICtrlRead($code)/256/256/256, ".") - 1)
$tmp=GUICtrlRead($code)-$octet1*256*256*256
$octet2=StringLeft($tmp/256/256, StringInStr($tmp/256/256, ".") - 1)
$tmp2=($tmp-$octet2*256*256)
$octet3=StringLeft($tmp2/256, StringInStr($tmp2/256, ".") - 1)
$octet4=$tmp2-$octet3*256
MsgBox(0,'Результат', $octet1 & '.' & $octet2 & '.' & $octet3 & '.' & $octet4)

EndSwitch
WEnd
GUIDelete($BGUI)

DedAlex
30-01-2014, 15:17
McLotos, для компьютерных расчетов, это не самый оптимальный алгоритм. Тут можно использовать BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm) и BitShift (http://www.autoitscript.com/autoit3/docs/functions/BitShift.htm).
IP в число:
$IP = BitShift($octet1, -24) + BitShift($octet2, -16) + BitShift($octet3, -8) + $octet4
число в IP:
$octet1 = BitAND(255, BitShift($IP, 24))
$octet2 = BitAND(255, BitShift($IP, 16))
$octet3 = BitAND(255, BitShift($IP, 8))
$octet4 = BitAND(255, IP))

P.S. Я не профессионал в AutiIt, мог что-то намутить :sorry:. Это скорее информация к размышлению, чем готовый код.




© OSzone.net 2001-2012