|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
Всем привет! Почему-то я не смог найти в 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 Вопрос заключается в том, правильно ли я все сделал? Не будет ли тормозить такой алгоритм в запросах при обращении к большим таблицам? Может есть какое-то более быстрое и гибкое решение? Подскажите, плиииз! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2016, 10:40 |
|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
IP-адрес по сути это 32-битное беззнаковое целое. И преобразование его "в число и обратно" звучит как минимум странненько. SlavikSGНе будет ли тормозить такой алгоритм в запросах при обращении к большим таблицам? Будет. SlavikSGМожет есть какое-то более быстрое и гибкое решение? В таблицах и запросах иметь дело ТОЛЬКО с binary(32) aka Long. А преобразования в строку и обратно использовать только на стадии ввода/вывода. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2016, 11:13 |
|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
SlavikSGВопрос заключается в том, правильно ли я все сделал?Очевидно, неправильно: Код: vbnet 1. 2.
Можно воспользоваться LSet: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Как уже указали, функции для форматирования в читабельный человеком вид нужны для представления результата человеку :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2016, 11:31 |
|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
Большое спасибо! Я понял. :) Инструкцию LSet я точно не догадался бы применить. Но теперь другая заковыка. Никак не могу сообразить, как грамотно сделать обратное преобразование. Как из строкового IP-адреса получить число Long не прибегая к ручной и медленной обработки строки Ip-адреса? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2016, 17:11 |
|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
SlavikSG, по аналогии с предыдущим примером Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2016, 19:27 |
|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
А в "Microsoft Access 97" есть функция spilt ? Чет у меня ошибку выдает. И в хелпе ее нет. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 14:13 |
|
Преобразуем Ip адрес в число и обратно
|
|||
---|---|---|---|
#18+
SlavikSGА в "Microsoft Access 97" есть функция spilt ? Чет у меня ошибку выдает. И в хелпе ее нет. :( в 97-м split нет, но можно воспользоваться этим - http://am.rusimport.ru/msaccess/f2.aspx?id=25860 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 14:33 |
|
|
start [/forum/topic.php?fid=45&fpage=110&tid=1613803]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 137ms |
0 / 0 |