Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
161 / 17 / 2
Регистрация: 14.07.2011
Сообщений: 74

Количество ip адресов

11.07.2012, 13:11. Показов 2020. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть даны 2 ip адреса 1.1.1.1 и 2.2.2.2. Необходимо вывести все ip адреса между ними. Знаю как реализовать на C#, стало интересно как это будет выгледить на vba
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.07.2012, 13:11
Ответы с готовыми решениями:

Задача "Подсчитайте максимальное количество сетей класса В и максимальное количество адресов ком. кл. С
Добрый вечер огромная просьба подскажите пожалуйста по задаче. Вроде же и простая но загнала в угол. Завтра в универ сдавать а осталась она...

Количество IP адресов в мире
Всем привет) Изучаю сети, но все никак не могу понять одну вещь. Если у нас возможно где-то 4.22 миллиарда белых айпи адресов, то как...

Количество ip адресов в диапазоне
Написать функцию ips_between(start, end), которая возвращает количество ip адресов, начиная с start и до end, не считая его. Start и end...

10
 Аватар для Watcher_1
357 / 163 / 27
Регистрация: 21.06.2011
Сообщений: 350
11.07.2012, 14:00
У меня получилось так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub m()
    Dim IP(1 To 4)
    For i = 1 To 4
        IP(i) = 1
    Next
    j = 4
    Do
       DoEvents
       IP(j) = IP(j) + 1
ne:
       If IP(j) > 2 Then
            IP(j) = 1
            j = j - 1
            If j = 0 Then Exit Do
            IP(j) = IP(j) + 1
            GoTo ne:
       End If
       tmp = ""
       For s = 1 To 4
            tmp = tmp & "." & IP(s)
       Next
       Debug.Print Mid$(tmp, 2)
       j = 4
    Loop
End Sub
1
161 / 17 / 2
Регистрация: 14.07.2011
Сообщений: 74
11.07.2012, 16:31  [ТС]
Watcher_1,

Данные адреса 4-х байтные. Все они лежат в диапазоне от 0.0.0.0 до 255.255.255.255 . Т.е последовательность будет выглядеть следующим образом:
1.1.1.1
1.1.1.2
1.1.1.3
.........
1.1.1.255
1.1.2.0
1.1.2.1
.........
и т.д.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
11.07.2012, 18:00
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Sub Print_IP_Range(IP1 as string, IP2 as string)
Dim IPB1(1 to 4) As integer
Dim IPB2(1 to 4) As integer
 
      Tmp=Split(IP1,".")
 
      for i%=0 to 3
          IPB1(i%+1)=Val(Tmp(i%))
      next i%
 
      Tmp=Split(IP2,".")
 
      for i%=0 to 3
          IPB2(i%+1)=Val(Tmp(i%))
      next i%
 
      Do
 
         q%=0
         For i%=1 to 4
              if IPB1(i%)=IPB2(i%) then q%=q%+1
         Next i%
 
         if q%=4 then Exit Do
 
         for i%=4 to 1 Step -1
             Debug.print IPB1(i%);
             if i%<>1 then Debug.print ".";
         Next i%
 
         Debug.Print ""
 
         IPB1(1)=IPB1(1)+1
 
         if IPB1(1) > 255 then
            IPB1(1)=0
            k%=2
            Do
              IPB1(k%)=IPB1(k%)+1
              If IPB1(k%) <= 255 then exit do
              IPB1(k%)=0
              k%=k%+1
           Loop
         End if
 
      Loop
 
End Sub
Диапазон "1.1.1.1" - "2.2.2.2" - не маленький...
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
11.07.2012, 18:33
Нет ребята, все вы не так делаете. IP, представленный 4 байтами - это 1 DWORD, в VB 4-байтовый массив преобразовать в тип Long. Я бы объявил RtlMoveMemory (известную как CopyMemory), скорировал бы значения в 2 переменные Long и For i = dIP1 to dIP2 ... Next Это самый оптимальный алгоритм для любого языка программирования.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.07.2012, 18:56
4 разряд - самая нижняя подсеть. Считать должно справа налево.

Сделал через систему счисления, хотя не особо в этом чего понимаю.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub test()
Print_IP_Range "1.1.1.1", "2.2.2.2"
End Sub
 
Sub Print_IP_Range(IP1$, IP2$)
Dim IPB(0 To 3), i%, Tmp, EndIP&
 
Tmp = Split(IP1, ".")
For i = 0 To 3
    IPB(i) = Val(Tmp(i))
Next i
Tmp = Split(StrReverse(IP2), ".")
For i = 0 To 3
    EndIP = EndIP + Tmp(i) * 256 ^ i
Next i
 
Do
    Debug.Print Join(IPB, ".")
    IPB(3) = IPB(3) + 1
    If IPB(3) > 255 Then IPB(3) = 0: IPB(2) = IPB(2) + 1
    If IPB(2) > 255 Then IPB(2) = 0: IPB(1) = IPB(1) + 1
    If IPB(1) > 255 Then IPB(1) = 0: IPB(0) = IPB(0) + 1
    DoEvents
Loop Until IPB(0) * 256 * 256 * 256 + IPB(1) * 256 * 256 + IPB(2) * 256 + IPB(3) > EndIP
End Sub
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
11.07.2012, 19:00
Цитата Сообщение от Diskretor Посмотреть сообщение
Считать должно справа налево.
- не столь важно, как считать, важно, как печатать...
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.07.2012, 19:13
Тоже верно,
кстати попробуй
Visual Basic
1
2
3
Sub test2()
Print_IP_Range "1.255.255.255", "2.2.2.2"
End Sub
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
11.07.2012, 19:35
Да, виноват. Следует вот так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Sub Print_IP_Range(IP1 as string, IP2 as string)
Dim IPB1(1 to 4) As integer
Dim IPB2(1 to 4) As integer
 
      Tmp=Split(IP1,".")
 
      for i%=0 to 3
          IPB1(4-i%)=Val(Tmp(i%))
      next i%
 
      Tmp=Split(IP2,".")
 
      for i%=0 to 3
          IPB2(4-i%)=Val(Tmp(i%))
      next i%
 
      Do
 
         q%=0
         For i%=1 to 4
              if IPB1(i%)=IPB2(i%) then q%=q%+1
         Next i%
 
         if q%=4 then Exit Do
 
         for i%=4 to 1 Step -1
             Debug.print IPB1(i%);
             if i%<>1 then Debug.print ".";
         Next i%
 
         Debug.Print ""
 
         IPB1(1)=IPB1(1)+1
 
         if IPB1(1) > 255 then
            IPB1(1)=0
            k%=2
            Do
              IPB1(k%)=IPB1(k%)+1
              If IPB1(k%) <= 255 then exit do
              IPB1(k%)=0
              k%=k%+1
           Loop
         End if
 
      Loop
 
End Sub
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
11.07.2012, 21:30
Лучший ответ Сообщение было отмечено как решение

Решение

Ну и мой вариант до кучи
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Const D256# = 256
 
Sub IP_Range()
Dim g#
For g = IP2Num("1.1.1.1") To IP2Num("2.2.2.2")
    Debug.Print Num2IP(g)
Next
End Sub
 
Function IP2Num#(sIP$)
Dim x
For Each x In Split(sIP, ".")
    IP2Num = IP2Num * D256 + x
Next
End Function
 
Function Num2IP$(ByVal n#)
Dim i&, n1#
For i = 1 To 4
    n1 = Int(n / D256)
    Num2IP = n - n1 * D256 & "." & Num2IP
    n = n1
Next
Num2IP = Left$(Num2IP, Len(Num2IP) - 1)
End Function
4
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
12.07.2012, 23:45
Лучший ответ Сообщение было отмечено как решение

Решение

Обнаружил, что если в переменной типа Variant/Decimal хранится целое число, это число выровнено по границе байта (для типа Double это не так). Поэтому из Decimal можно доставать байты без лишней арифметики:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  (Destination As Any, Source As Any, ByVal Length As Long)
 
Sub IP_Range()
Dim g, b(0 To 15) As Byte, i&
For g = IP2NumD("1.1.1.1") To IP2NumD("2.2.2.2")
    CopyMemory b(0), g, 16& 'скопировать g (Variant/Decimal) в байтовый массив
    For i = 11 To 9 Step -1
        Debug.Print b(i) & ".";
    Next
    Debug.Print CStr(b(i))
Next
End Sub
 
Function IP2NumD(sIP$) 'возвращает Variant/Decimal
Dim x
For Each x In Split(sIP, ".")
    IP2NumD = IP2NumD * 256# + x
Next
IP2NumD = CDec(IP2NumD)
End Function
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2012, 23:45
Помогаю со студенческими работами здесь

Количество ip-адресов на одном компьютере?
Хотел на одном компьютере использовать 2 ip-адреса, каким образом это нужно сделать? нужно 2 сетевых адаптера? и зависит ли это от...

Как рассчитать количество хостов в диапозоне ip адресов?
Я не особо разбираюсь в сетях, по этому возникла проблема. В общем нужно рассчитать количество хостов в диапазоне ip адресов от...

Количество IP-адресов от провайдера ограничено. Как его увеличить?
Имеется Windows Server 2003 и локальная сеть через сервер на 70 компьютеров в школе. Все ip-адреса от провайдера раздаются автоматически...

Вычислить количество IP адресов, которые можно составить из данного числа
Помогите решить следующую задачу. (нужна идея). Имеется целое число от 4 до 14 разрядов. Нужно вычислить количество IP адресов которые...

Какое максимальное количество IP адресов для узлов доступно в сети
Здравствуйте, расскажите, пожалуйста как решить подобную задачу: Маска сети для IPv4 адресации *– это 4-х байтное число, которое делит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru