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 и всё.
PS Лучше следовать сетевому этикету и обращаться друг к другу на "ты", иначе мне, да и не только, я думаю, не удобно обращаться к человеку на "ты", в то время как ко мне обращаются - на "вы"...
' Держи, все написано 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
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))
Если говорят, что в ПБ нет какой-либо ВБ функции, то не верьте, а почитайте хельп по-внимательнее(.. Скорее всего либой она просто называется по-другому или входит в состав другой функции. Аналог ВБшкого сплита, "PARSE". Так что см. хельп по ключевым словам PARSE, PARSE$, PARSECOUNT... и не надо такие штрашные функции придумывать
Спасибо всем, давшим ответы. Попробую разобраться. Хотя главного, простого и ясного ответа на свой вопрос я так и не получил. Готовые листинги это конечно хорошо, но главного я так и не понял - в каком виде передаётся 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 )) Если кто сможет мне всё же объяснить - "Где собака порылась" буду крайне признателен.
> главного я так и не понял - в каком виде передаётся 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, который выдаст тебе нужное число:
> в последнем примере появилась ещё одна загадочная для меня строчка Call MoveMemory(outVal, bt, Len(bt)) - MoveMemory - это что за функция? Среди стандартных PB я такого не нашёл.
Это API-функция, переносящая по адресу outVal байты с адреса bt количеством Len(bt). В связи с тем, что VB по умолчанию передает параметры по ссылке, т.е. их адрес, вместо адреса пишут имя переменной без ByVal.
Следущий ламерский вопрос. Есть ли PB аналог Вондосового net send {hostname} [message] или как использовать net send или любую другую системную команду из-под PB?
Дружище, почему ж вы такой упрямый. Вам же русским языком сказали что 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