powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Преобразуем Ip адрес в число и обратно
8 сообщений из 8, страница 1 из 1
Преобразуем Ip адрес в число и обратно
    #39172031
SlavikSG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Почему-то я не смог найти в Microsoft Access на чистом Visual Basic ни одного живого и до конца написанного примера перевода строкового IP-адреса в число и обратно. Находил примеры только на других языках. В результате родились две функции такого вида:

' Преобразуем число в строковый IP-адрес
Function Ip_to_String(Sss As Long)

Dim R1 As Double
Dim R2 As Double
Dim R3 As Double
Dim R4 As Double

R1 = Int(Sss / 256 / 256 / 256) 'Определяем 1 октет IP-адреса
R2 = Int((Sss - R1 * 256 * 256 * 256) / 256 / 256) 'Определяем 2 октет IP-адреса
R3 = Int((Sss - R1 * 256 * 256 * 256 - R2 * 256 * 256) / 256) 'Определяем 3 октет IP-адреса
R4 = Int(Sss - R1 * 256 * 256 * 256 - R2 * 256 * 256 - R3 * 256) 'Определяем 4 октет IP-адреса

'Сливаем все в одну кучу
Ip_to_String = Trim(Str(R1)) & "." & Trim(Str(R2)) & "." & Trim(Str(R3) & "." & Trim(Str(R4)))

End Function


' Преобразуем строковый IP-адрес в число
Function Ip_to_Integer(Sss As String)

Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte

N1 = InStr(1, Sss, ".") ' Находим положение первой точки
N2 = InStr(N1 + 1, Sss, ".") ' Находим положение второй точки
N3 = InStr(N2 + 1, Sss, ".") ' Находим положение третьей точки

'Сливаем все в одну кучуIp_to_Integer = Mid(Sss, 1, N1 - 1) * 256 * 256 * 256 + Mid(Sss, N1 + 1, N2 - N1 - 1) * 256 * 256 + Mid(Sss, N2 + 1, N3 - N2 - 1) * 256 + Mid(Sss, N3 + 1, Len(Sss) - N3)

End Function


Вопрос заключается в том, правильно ли я все сделал? Не будет ли тормозить такой алгоритм в запросах при обращении к большим таблицам? Может есть какое-то более быстрое и гибкое решение? Подскажите, плиииз!
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39172071
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IP-адрес по сути это 32-битное беззнаковое целое. И преобразование его "в число и обратно" звучит как минимум странненько.

SlavikSGНе будет ли тормозить такой алгоритм в запросах при обращении к большим таблицам?
Будет.

SlavikSGМожет есть какое-то более быстрое и гибкое решение?
В таблицах и запросах иметь дело ТОЛЬКО с binary(32) aka Long. А преобразования в строку и обратно использовать только на стадии ввода/вывода.
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39172091
SlavikSGВопрос заключается в том, правильно ли я все сделал?Очевидно, неправильно:
Код: vbnet
1.
2.
?Ip_to_String(&hc00002eb)
-64.0.2.235

Можно воспользоваться LSet:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Type TLong
   l As Long
End Type

Private Type TQuadByte
   b(0 To 3) As Byte
End Type

Function Ip_to_String2(Sss As Long) As String
 Dim l As TLong
 Dim qb As TQuadByte
 l.l = Sss
 LSet qb = l
 'Сливаем все в одну кучу
 Ip_to_String2 = Format(qb.b(3)) & "." & Format(qb.b(2)) & "." & Format(qb.b(1)) & "." & Format(qb.b(0))
End Function



Как уже указали, функции для форматирования в читабельный человеком вид нужны для представления результата человеку :)
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39194705
SlavikSG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо! Я понял. :)

Инструкцию LSet я точно не догадался бы применить. Но теперь другая заковыка. Никак не могу сообразить, как грамотно сделать обратное преобразование. Как из строкового IP-адреса получить число Long не прибегая к ручной и медленной обработки строки Ip-адреса?
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39194833
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SlavikSG, по аналогии с предыдущим примером
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function Ip_to_Long(Sss As String) As Long
 Dim l As TLong
 Dim qb As TQuadByte
 Dim varArray As Variant
 Dim i As Long
On Error Resume Next
 varArray = Split(Sss, ".")
    For i = 0 To 3
        qb.b(i) = varArray(3 - i)
    Next i
Erase varArray
LSet l = qb
Ip_to_Long = l.l
End Function
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39195382
SlavikSG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в "Microsoft Access 97" есть функция spilt ? Чет у меня ошибку выдает. И в хелпе ее нет. :(
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39195430
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SlavikSGА в "Microsoft Access 97" есть функция spilt ? Чет у меня ошибку выдает. И в хелпе ее нет. :(
в 97-м split нет, но можно воспользоваться этим -
http://am.rusimport.ru/msaccess/f2.aspx?id=25860
...
Рейтинг: 0 / 0
Преобразуем Ip адрес в число и обратно
    #39195481
SlavikSG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага. Понял. Спасибо! :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Преобразуем Ip адрес в число и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]