Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: Простите за ламерский вопрос, но очень нужно уз... Добавлено: 11.03.04 18:23  

Автор вопроса:  Кто-то

Как правильно преобразовать string в IP адрес?

Простой пример: В моей сетке есть комп NONAME c IP адресом 192.168.13.102

...

HOST ADDR "NONAME" TO ip

MSGBOX STR$(ip)

...

стринговое значение IP возвращается как 1712171200

Как преобразовать $ip = "192.168.13.102" в &ip = 1712171200 ?

Заранее благодарен :)))

Ответить

  Ответы Всего ответов: 23  

Номер ответа: 1
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #1 Добавлено: 11.03.04 18:45

Объявы

Public Type myBytes

B1 As Byte

B2 As Byte

B3 As Byte

B4 As Byte

End Type

Public Type myLong

Val As Long

End Type

___________________

туда.

Public Function Long2IP(ByVal IP As Long) As String

Dim L As myLong

Dim B As myBytes

L.Val = IP

LSet B = L

Long2IP = Trim(Str$(B.B1)) + "." + Trim(Str$(B.B2)) + "." + Trim(Str$(B.B3)) + "." + Trim(Str$(B.B4))

End Function

____________________________

Обратно

Public Function IP2Long(IP As String) As Long

ReDim parse(0 To 3) As String

Dim B As myBytes

Dim L As myLong

parse = Split(IP, ".")

B.B1 = Val(parse(0))

B.B2 = Val(parse(1))

B.B3 = Val(parse(2))

B.B4 = Val(parse(3))

LSet L = B

IP2Long = L.Val

End Function

Ответить

Номер ответа: 2
Автор ответа:
 Кто-то



Вопросов: 3
Ответов: 12
 Профиль | | #2 Добавлено: 12.03.04 08:09

Конечно спасибо, но ответ меня ещё больше запутал.

Среди директив PBasic я не нашел слова Public показанная Вами в качестве примера конструкция не работает.

Пожалуйста объясните на пальцах, я в PBasic как и в VBasic совсем ламер.

Допустим, мы имеем

$ip = "192.168.13.102"

Мы разложили это на части и получили

$ip1 = "192"

$ip2 = "168"

$ip3 = "13"

$ip4 = "102"

как мне это преобразовать в &ip_num = 1712171200, из Вашего примера я ничего не понял - ламер, что поделаешь.

Вот это 1712171200 вообще, что за число? В каком формате так сказать?

Если я делаю

ip = 1712171200

HOST NAME ip TO name

MSGBOX STR$(name) 'Значение name здесь возвращает "NONAME" т.е. всё ОК.

И почему для компа с адресом например 192.168.13.135

HOST ADDR "NONAME" TO ip

MSGBOX STR$(ip)

Возвращаемое значение ip = -2029147968 ?

В общем вопросов прибавилось :(

Ответить

Номер ответа: 3
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #3 Добавлено: 12.03.04 10:01

Тьфу [beep]!

Это я просахатил. Сорри. Это было для VB5.0/6.0.

Как писать в ПаверВасике - не в курсе (т.к. с последним не знаком). Может энтузиасты перепишут под PB...

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 12.03.04 15:32

Все в точности так же, только у некоторых функций необходимо в конец добавить знак "$", например: Trim$()

Все Public следует опустить, т.к. их на самом деле нет, да и там они не нужны... (Там все Public, а экспортируемые длл функции - Export)

Ответить

Номер ответа: 5
Автор ответа:
 Кто-то



Вопросов: 3
Ответов: 12
 Профиль | | #5 Добавлено: 12.03.04 16:19

2 sne Может Вы поможете разобраться, вы пишите "Всё точно также..." Пожалуйста разъясните тупому по строкам.

Dim B As myBytes 'Здесь мы оббъявляем переменную В типа myBytes - что это за тип? Объявлен пользовательский тип? Зачем? Стандартных типов переменных недостаточно?

Dim L As myLong ' Аналогично предыдущему, что за тип myLong ???

parse = Split(IP, ".") 'Не знаю, что делает Split (в PowerBasic нет такого), но догадываюсь, что из string переменной IP удалены точки и что-то ещё сделано. Это что-то присвоено переменной parse

B.B1 = Val(parse(0)) '

B.B2 = Val(parse(1)) 'здесь заполняется массив B? Чем? parse вроде не объявлена как массив, почему у неё оказываются (0) и т.д.?

B.B3 = Val(parse(2)) '

B.B4 = Val(parse(3)) '

LSet L = B '"LSET left-aligns a string into the space of another string or variable of a User-Defined Type" - так написано в хелпе т.е. в массив L заталкиваются значения массива B?

IP2Long = L.Val 'Здесь вообще ничего не понятно. Конструкция с точкой L.Val непонятна абсолютно... :(

И что, проделав это я могу делать

HOST NAME IP2Long TO hostname ?

Ничего не понятно, литературы по PBasic нет, полдня пытался написать Hello World - написал таки :))) Тепрь с этим затык, а главное нет доходчивых объяснений, как будто народ ещё меньше меня знает :))).

Может вы сможете объяснить на приведённом мной примере? Есть строковая переменная, её всего лишь надо преобразовать в адрес IP и всё.

Спасибо заранее.

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 12.03.04 16:48

Хорошо, я посмотрю...

PS
Лучше следовать сетевому этикету и обращаться друг к другу на "ты", иначе мне, да и не только, я думаю, не удобно обращаться к человеку на "ты", в то время как ко мне обращаются - на "вы"...

Ответить

Номер ответа: 7
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #7
Добавлено: 12.03.04 19:05

' Держи, все написано 100 % на PB и на API, так что проблемм возникнуть не должно...
' Это листинг dll'ки, но при желдаии, я думаю, ни у кого не вызовет затруднений переделать сие под свои нужды...

 

#Compile Dll "DllIP.dll"
#Dim All

 

#Include "Win32API.inc"

 

Declare Function Split(ByVal in_Str As String, ByVal sDel As String, ByRef outArr() As String) As Long

 

Type myBytes
B1 As Byte
B2 As Byte
B3 As Byte
B4 As Byte
End Type

 

Function Long2IP Alias "Long2IP"(ByVal IP As Long) Export As String
Dim bt As myBytes

 

Call MoveMemory(bt, IP, Len(bt))
Function = Trim$(Str$(bt.B1)) + "." + Trim$(Str$(bt.B2)) + "." + Trim$(Str$(bt.B3)) + "." + Trim$(Str$(bt.B4))
End Function

 

Function IP2Long Alias "IP2Long"(ByVal IP As String) Export As Long
Local Arr() As String: ReDim Arr(0)
Local bt As myBytes
Local outVal As Long

 

If Not Split(IP, ".", Arr()) = 3 Then Exit Function

 

bt.B1 = Val(Arr(0))
bt.B2 = Val(Arr(1))
bt.B3 = Val(Arr(2))
bt.B4 = Val(Arr(3))

 

Call MoveMemory(outVal, bt, Len(bt))
Function = outVal
End Function

 

' Функция замены VB'шного Split'а. Пусть она не такая уж и шустрая, но за то работает...
Function Split(ByVal in_Str As String, ByVal sDel As String, ByRef outArr() As String) As Long
Local i As Long, j As Long
Local OldPos As Long

 

Erase outArr
OldPos = 1&

 

For i = 1 To Len(in_Str)
If (Mid$(in_Str, i, Len(sDel)) = sDel Or i + 1 = Len(in_Str)) Then
ReDim Preserve outArr(UBound(outArr) + 1&)
outArr(UBound(outArr)) = Mid$(in_Str, OldPos, IIf(i + 1 = Len(in_Str), Len(in_Str), i - OldPos))

 

OldPos = i + 1&
End If
Next

 

Function = UBound(outArr)
End Function

Ответить

Номер ответа: 8
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 12.03.04 19:06

Да, вот если еще захочется это использовать из VB, вот декларации:


Private Declare Function Long2IP Lib "DllIP.dll" (ByVal IP As Long) As String

Private Declare Function IP2Long Lib "DllIP.dll" (ByVal IP As String) As Long

Ответить

Номер ответа: 9
Автор ответа:
 brevno



Вопросов: 18
Ответов: 57
 Web-сайт: smsquest.by.ru
 Профиль | | #9
Добавлено: 14.03.04 00:56

Если говорят, что в ПБ нет какой-либо ВБ функции, то не верьте, а почитайте хельп по-внимательнее(.. Скорее всего либой она просто называется по-другому или входит в состав другой функции. Аналог ВБшкого сплита, "PARSE". Так что см. хельп по ключевым словам PARSE, PARSE$, PARSECOUNT... и не надо такие штрашные функции придумывать

Ответить

Номер ответа: 10
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #10
Добавлено: 14.03.04 01:30

2brevno, Ну перемудрил чуточку, ни без этого :)))

Ответить

Номер ответа: 11
Автор ответа:
 Кто-то



Вопросов: 3
Ответов: 12
 Профиль | | #11 Добавлено: 15.03.04 06:33

Спасибо всем, давшим ответы. Попробую разобраться. Хотя главного, простого и ясного ответа на свой вопрос я так и не получил. Готовые листинги это конечно хорошо, но главного я так и не понял - в каком виде передаётся IP по сети. Совершенно очевидно что это четыре восьмибитных слова (с этим и связана IP адресация от 0 до 255). Но какие биты и из какой части IP адреса и в какой последовательности, я так и не понял. Буду думать. Уже несколько дней пытаюсь из 192.168.13.102 получить 1712171200, а из 192.168.13.135 - -2029147968, пока ничего не выходит. С каждым ответом вопросов только прибавляется, в последнем примере появилась ещё одна загадочная для меня строчка Call MoveMemory(outVal, bt, Len(bt)) - MoveMemory - это что за функция? Среди стандартных PB я такого не нашёл. Наверное придётся купить книжку по VB и по ней изучать PB :))) Если кто сможет мне всё же объяснить - "Где собака порылась" :) буду крайне признателен.

Ответить

Номер ответа: 12
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 15.03.04 07:49

> главного я так и не понял - в каком виде передаётся IP по сети.

В виде 4-битного целого, т.е. long

> Совершенно очевидно что это четыре восьмибитных слова

От этой фразы отчетливо пахнет маразмом. Слово - это два байта.

> Но какие биты и из какой части IP адреса и в какой последовательности, я так и не понял. Уже несколько дней пытаюсь из 192.168.13.102 получить 1712171200

В процессорах x86 четырехбитное целое имеет обратный порядок байтов, т.е. в памяти &H12345678 (305419896) хранится в виде 78 56 34 12. IP хранится как строка, т.е. байты идут в прямом порядке или chr(192) & chr(168) & chr(13) & chr(102), т.е. C0 A8 0D 66, что, принимая во внимание устройство типа long, равно &H660DA8C0 = 1712171200. Это верно только для IPv4 и типа unsigned long, для signed long самый старший байт определяет знак, так, чтобы при операциях чисел по модулю 2^32 они образовывали кольцо (линейную алгебру знаешь?). Поэтому для преобразования unsigned long в long надо вычесть из него 2^32, если он больше 2^31. Вот код на VB, который выдаст тебе нужное число:

Private Sub Command1_Click()

ip = Val(Split(Text1, ".")(0)) + Val(Split(Text1, ".")(1)) * 2 ^ 8 + Val(Split(Text1, ".")(2)) * 2 ^ 16 + Val(Split(Text1, ".")(3)) * 2 ^ 24

If ip > 2 ^ 31 Then ip = ip - 2 ^ 32

MsgBox ip

End Sub

> в последнем примере появилась ещё одна загадочная для меня строчка Call MoveMemory(outVal, bt, Len(bt)) - MoveMemory - это что за функция? Среди стандартных PB я такого не нашёл.

Это API-функция, переносящая по адресу outVal байты с адреса bt количеством Len(bt). В связи с тем, что VB по умолчанию передает параметры по ссылке, т.е. их адрес, вместо адреса пишут имя переменной без ByVal.

Ответить

Номер ответа: 13
Автор ответа:
 Кто-то



Вопросов: 3
Ответов: 12
 Профиль | | #13 Добавлено: 15.03.04 08:22

Наконец разобрался,вот смотрите.

IP адрес 192.168.13.102

В двоичном виде - это четыре восьмибитных слова - 1100000 10101000 00001101 01100110

меняем старшие слова с младшими получаем 01100110 00001101 10101000 1100000 или в десятичном виде - 1712171200 - что и требовалось получить.

Всем спасибо. Всё получилось.

Ответить

Номер ответа: 14
Автор ответа:
 Кто-то



Вопросов: 3
Ответов: 12
 Профиль | | #14 Добавлено: 15.03.04 11:18

Следущий ламерский вопрос. Есть ли PB аналог Вондосового net send {hostname} [message] или как использовать net send или любую другую системную команду из-под PB?

Ответить

Номер ответа: 15
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #15
Добавлено: 16.03.04 02:44

 Дружище, почему ж вы такой упрямый. Вам же русским языком сказали что 8-ми битных слов не бывает.
Или вы под ZX-SPECTRUM программы делаете?
Лучше бы не строили умника, а заглянули бы в каталог \PBWin70\Samples\Internet\TCP


#Compile Exe

Declare Function IpToString (ByVal ip As Long) As String

Function PbMain
  Dim LongVar As Long
 IPSTR$ = InputBox$("Input Long variable","А в инпутбоксе руссиан нот супортед :(")
 LongVar=Val(IPSTR$)
 MsgBox IpToString(LongVar)
End Function

Function IpToString (ByVal ip As Long) As String
    Local b As Byte Ptr
    b = VarPtr(ip)
    Function = Format$(@b[0]) + "." + Format$(@b[1]) + "." _
             + Format$(@b[2]) + "." + Format$(@b[3])
End Function

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам