Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Хочу все знать (http://forum.oszone.net/forumdisplay.php?f=23)
-   -   [решено] Вот как вычислить IP (http://forum.oszone.net/showthread.php?t=276721)

McLotos 29-01-2014 22:25 2298841

Вот как вычислить IP
 
Долго ломал голову, и никак не додумаюсь
Вот смотрите:
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 2298870

Обратно тому что вы написали.

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 2298902

DedAlex, спасибо, как-то я не сообразил.

McLotos 30-01-2014 14:19 2299213

В общем чтобы каждый раз так не считать (а то взрыв мозга можно заработать), написал скриптик
читать дальше »
Код:

#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($octet3)*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 2299263

McLotos, для компьютерных расчетов, это не самый оптимальный алгоритм. Тут можно использовать BitAND и BitShift.
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:. Это скорее информация к размышлению, чем готовый код.


Время: 08:48.

Время: 08:48.
© OSzone.net 2001-