Что нового

[Данные, строки] ip адреса из интервала в массив

freed21

Новичок
Сообщения
39
Репутация
1
Добрый день, друзья. Мой вопрос может и простой, но после двух часов раздумий, моя голова взрывается конкретно :stars:..
Суть такова. Есть два элемента _GUICtrlIpAddress. В первый элемент мы задаем нижнюю границу диапазона ip адресов, а во второй, соответственно, верхнюю. В этих элементах данные выглядят как х.х.х.х, т.е. это не числовые значения. Как получить массив всех адресов из этого интервала?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Код:
_GUICtrlIpAddress_GetArray

Вы что ли справку то до конца не читаете? :blink:
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Проблему с разделением ip адреса на поля я уже решил, единственное что при помощи регулярных выражений. Вопрос заключался в том, что мне нужно извлечь в массив все IP адреса из интервала. Т.е. если есть интервал х.х.х.х - у.у.у.у, мне нужно каждый адрес из этого интервала записать в массив.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
freed21,
Дайте пример х.х.х.х и у.у.у.у и то, что в итоге нужно получить.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles [?]
Дайте пример х.х.х.х и у.у.у.у и то, что в итоге нужно получить.
Наверное тс хочет что бы любые диапазоны от и до, превращались в список адресов. Например от 0.0.0.0 до 255.255.255.255 должен формировать 2^32 адресов.
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Пример:
1.1.1.1 - 8.8.8.8 это интервал

массив:
1.1.1.1
1.1.1.2
1.1.1.3
...
1.1.1.255
1.1.2.0
...
8.8.8.7
8.8.8.8

Из интервала ip адресов мне нужно получить массив такого вида.


Добавлено:
Сообщение автоматически объединено:

Да, madmasles прав :smile: Неужели я все так косноязычно объяснил?)
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Именно ip адреса.. Хотя я не совсем понял что значит "все подряд" ;)


Добавлено:
Сообщение автоматически объединено:

как же так не бывает? бывают только обозначают они всю сеть.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
файл со списком адресов устроит?
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
C2H5OH, а почему в массив нельзя? Или у вас есть какой то готовый вариант этой задачи?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
отсюда

Код:
$start = '1.1.1.1'
$end = '1.1.2.200'

$long_start=ip2int($start)
$long_end=ip2int($end)
$dif=$long_end-$long_start

Local $out[$dif + 1]

For $i = 0 To  $dif
	$out[$i] = int2ip($long_start+$i)
	ConsoleWrite($out[$i] & @LF)
Next
#include <array.au3>
_ArrayDisplay($out)


Func ip2int($realIp)
	Local $ipoct = StringSplit($realIp,'.',2)
	Local $oct1 = $ipoct[0]
	Local $oct2 = $ipoct[1]
	Local $oct3 = $ipoct[2]
	Local $oct4 = $ipoct[3]
	Return $oct1*16777216+$oct2*65536+$oct3*256+$oct4
EndFunc

Func int2ip($intIp)
	Local $oct1n = Int($intIp/16777216)
	Local $oct2n = Int(($intIp-$oct1n*16777216)/65536)
	Local $oct3n = Int(($intIp-$oct1n*16777216-$oct2n*65536)/256)
	Local $oct4n = Int($intIp-$oct1n*16777216-$oct2n*65536-$oct3n*256)
	Return $oct1n & '.' & $oct2n & '.' & $oct3n & '.' & $oct4n
EndFunc
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Вот это я понимаю! Спасибо, дружище, все коротко и работает :ok:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
#include <GuiConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <Array.au3>

;$loIP = _GUICtrlIpAddress_GetArray ($loIPAddress)
;$hiIP = _GUICtrlIpAddress_GetArray ($hiIPAddress)
Global $loIP[4] = [10,1,0,250]
Global $hiIP[4] = [10,1,1,2]

$loIndex = $loIP[0]*256*256*256+$loIP[1]*256*256+$loIP[2]*256+$loIP[3]
$hiIndex = $hiIP[0]*256*256*256+$hiIP[1]*256*256+$hiIP[2]*256+$hiIP[3]

Global $aRes[1] =["список IP"]

For $i = $loIndex To $hiIndex
	$b1 = StringLeft(Hex($i,8),2)
	$b2 = StringMid(Hex($i,8),3,2)
	$b3 = StringMid(Hex($i,8),5,2)
	$b4 = StringRight(Hex($i,8),2)
	$res = (Dec($b1)&"."&Dec($b2)&"."&Dec($b3)&"."&Dec($b4))
	_ArrayAdd($aRes,$res)
Next

_ArrayDisplay($aRes)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Его, наверное.
ArrayAdd медленно работает. Вот я сейчас подправлю. :smile:


Добавлено:
Сообщение автоматически объединено:

Код:
#include <GuiConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <Array.au3>

;$loIP = _GUICtrlIpAddress_GetArray ($loIPAddress)
;$hiIP = _GUICtrlIpAddress_GetArray ($hiIPAddress)
Global $loIP[4] = [10,1,0,250]
Global $hiIP[4] = [10,1,1,2]

$loIndex = $loIP[0]*256*256*256+$loIP[1]*256*256+$loIP[2]*256+$loIP[3]
$hiIndex = $hiIP[0]*256*256*256+$hiIP[1]*256*256+$hiIP[2]*256+$hiIP[3]

Global $aRes[$hiIndex-$loIndex+1]
$aInd = 0

For $i = $loIndex To $hiIndex
	$b1 = StringLeft(Hex($i,8),2)
	$b2 = StringMid(Hex($i,8),3,2)
	$b3 = StringMid(Hex($i,8),5,2)
	$b4 = StringRight(Hex($i,8),2)
	$aRes[$aInd]  = (Dec($b1)&"."&Dec($b2)&"."&Dec($b3)&"."&Dec($b4))
	$aInd += 1
Next

_ArrayDisplay($aRes)
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Есть предчувствие что тот, в котором нет операции деления)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
:smile: Подправил тоже, нету функций, нету объявления локальных переменых.
Код:
$start = '1.1.1.1'
$end = '1.1.2.255'
$long_start = ip2int($start)
$long_end = ip2int($end)
$dif = $long_end - $long_start
Local $out[$dif + 1]
For $i = 0 To $dif
	$intIp = $long_start + $i
	$oct1n = Int($intIp / 16777216)
	$a = $intIp - $oct1n * 16777216
	$oct2n = Int($a / 65536)
	$b = $oct2n * 65536
	$c = $a - $b
	$oct3n = Int($c / 256)
	$out[$i] =$oct1n & '.' & $oct2n & '.' & $oct3n & '.' & Int($c - $oct3n * 256)
Next
Func ip2int($realIp)
	Local $ipoct = StringSplit($realIp, '.', 2)
	Return $ipoct[0] * 16777216 + $ipoct[1] * 65536 + $ipoct[2] * 256 + $ipoct[3]
EndFunc   ;==>ip2int

и этот код быстрее
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
freed21,
Мой вариант (только диапазон берем 1.1.1.1 - 1.1.8.8, т.к. 1.1.1.1 - 8.8.8.8 даст 117901064 штук :smile:).
Код:
#include <Array.au3>

Global $sStartIP = '1.1.1.1', $sEndIP = '1.1.8.8', $aRangeIP, $iTimer, $sTime

$iTimer = TimerInit()
$aRangeIP = _GetIPRange($sStartIP, $sEndIP)
If @error Then Exit 13
$sTime = Round(TimerDiff($iTimer), 2) & ' ms'
_ArrayDisplay($aRangeIP, $sTime)

Func _GetIPRange($s_StartIP, $s_EndIP)
	Local $i_StartNum, $i_EndNum

	$i_StartNum = _IP_To_Num($s_StartIP)
	$i_EndNum = _IP_To_Num($s_EndIP)
	If ($i_StartNum = -1) Or ($i_EndNum = -1) Then Return SetError(1)
	If $i_StartNum = $i_EndNum Then
		Local $a_Ret[2] = [1, $s_StartIP]
		Return $a_Ret
	EndIf
	Local $i_Start, $i_End

	If $i_StartNum > $i_EndNum Then
		$i_Start = $i_EndNum
		$i_End = $i_StartNum
	Else
		$i_Start = $i_StartNum
		$i_End = $i_EndNum
	EndIf
	Local $a_Ret[$i_End - $i_Start + 2] = [$i_End - $i_Start + 1], $a_Num_to_IP[3] = [16777216, 65536, 256], $i_Num, $i_Tmp

	For $i = 0 To $i_End - $i_Start
		$i_Num = $i + $i_Start
		For $j = 0 To 2
			$i_Tmp = Int($i_Num / $a_Num_to_IP[$j])
			$a_Ret[$i + 1] &= $i_Tmp & '.'
			$i_Num -= $i_Tmp * $a_Num_to_IP[$j]
		Next
		$a_Ret[$i + 1] &= $i_Num
	Next
	Return $a_Ret
EndFunc   ;==>_GetIPRange

;~ функция не используется
Func _Num_To_IP($i_Num)
	Local $a_Mult[3] = [16777216, 65536, 256], $s_IP, $i_Tmp

	For $i = 0 To 2
		$i_Tmp = Int($i_Num / $a_Mult[$i])
		$s_IP &= $i_Tmp & '.'
		$i_Num -= $i_Tmp * $a_Mult[$i]
	Next
	$s_IP &= $i_Num
	Return $s_IP
EndFunc   ;==>_Num_To_IP

Func _IP_To_Num($s_IP)
	Local $a_Mult[4] = [3, 16777216, 65536, 256], $i_Num, $a_IP

	$a_IP = StringSplit($s_IP, '.')
	If $a_IP[0] <> 4 Then Return -1
	For $i = 1 To 3
		$i_Num += $a_IP[$i] * $a_Mult[$i]
	Next
	$i_Num += $a_IP[4]
	Return $i_Num
EndFunc   ;==>_IP_To_Num
 
Верх