PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как преобразовать строку ASCIIZ в строку Пурика?


Как преобразовать строку ASCIIZ в строку Пурика?

Сообщений 1 страница 5 из 5

1

@чет туплю после долгого перерыва

Есть Виндовая функция которая возвращает ссылку на ASCIIZ

The inet_ntoa function takes an Internet address structure specified by the in parameter and returns a NULL-terminated ASCII

Нужно добавить результат к имеющейся пуриковской строке.

P.S. Или каким нибудь другим способом получить функцию обратную inet_addr_("192.168.0.5")

0

2

SadStar написал(а):

Есть Виндовая функция которая возвращает ссылку на ASCIIZ

ASCIIZ это формат строк PB, при сборке проги в ASCII формате.

SadStar написал(а):

Или каким нибудь другим способом получить функцию обратную inet_addr_("192.168.0.5")

Пиши точнее что нужно.
Пример с inet_addr.

Код:
 ;Узнать имя компа в сети по IP адресу.
Procedure.s GetHostNameByIP(ip$) 
  Protected wsa.WSAData, *host.hostent = 0
  Protected Count, *Mem
  If ip$<>""
    Count = StringByteLength(ip$, #PB_Ascii)
    If Count>0
      *Mem = AllocateMemory(Count+4)
      If *Mem
        FillMemory(*Mem, Count+4, 0, #PB_Byte)
        PokeS(*Mem, ip$, -1, #PB_Ascii)
        ipaddr=inet_addr_(*Mem)
        If ipaddr<>-1 And ipaddr<>#INADDR_ANY
          *host=gethostbyaddr_(@ipaddr,4,#AF_INET)
        EndIf
        FreeMemory(*Mem)
      EndIf
    EndIf
  EndIf
  If *host 
    ProcedureReturn PeekS(*host\h_name, -1, #PB_Ascii) 
  Else 
    ProcedureReturn ""
  EndIf 
EndProcedure

InitNetwork()
Debug GetHostNameByIP("127.0.0.1")

Если прога в ASCII, то код можно упростить.

Код:
;Узнать имя компа в сети по IP адресу.
Procedure.s GetHostNameByIP(ip$) 
  Protected wsa.WSAData, *host.hostent = 0
  If ip$<>""
    ipaddr=inet_addr_(@ip$)
    If ipaddr<>-1 And ipaddr<>#INADDR_ANY
      *host=gethostbyaddr_(@ipaddr,4,#AF_INET)
    EndIf
  EndIf
  If *host 
    ProcedureReturn PeekS(*host\h_name) 
  Else 
    ProcedureReturn ""
  EndIf 
EndProcedure

InitNetwork()
Debug GetHostNameByIP("127.0.0.1")

Возможно это нужно?

Код:
Procedure.l GetIP_HostName(Name.s) ; Получение IP адреса по доменному имени.
  Protected *hostinfo.HOSTENT
  Protected IP.l, Count, *Mem, sin_addr
  
  IP=0 : sin_addr=#INADDR_ANY
  
  Count = StringByteLength(Name, #PB_Ascii)
  *Mem = AllocateMemory(Count+4)
  If *Mem
    FillMemory(*Mem, Count+4, 0, #PB_Byte)
    PokeS(*Mem, Name, -1, #PB_Ascii)
    sin_addr=inet_addr_(*Mem)
    If sin_addr=-1 Or sin_addr=#INADDR_ANY
      *hostinfo = gethostbyname_(*Mem)
      If *hostinfo
        If *hostinfo\h_addrtype=#AF_INET
          *ptr=PeekI(*hostinfo\h_addr_list)
          If *ptr
            sin_addr=PeekL(*ptr)
          EndIf
          *ptr=0
        EndIf
      Else
        sin_addr=-1
      EndIf
    EndIf
    FreeMemory(*Mem)
  EndIf
  
  If sin_addr<>-1 And sin_addr<>#INADDR_ANY
    IP = sin_addr
  EndIf
  
  ProcedureReturn IP
EndProcedure

InitNetwork()
Debug IPString(GetIP_HostName("localhost"))

Упрощенный вариант (только ASCII).

Код:
Procedure.l GetIP_HostName(Name.s) ; Получение IP адреса по домменому имени.
  Protected *hostinfo.HOSTENT
  Protected IP.l, sin_addr
  
  IP=0 : sin_addr=#INADDR_ANY
  sin_addr=inet_addr_(@Name)
  If sin_addr=-1 Or sin_addr=#INADDR_ANY
    *hostinfo = gethostbyname_(@Name)
    If *hostinfo
      If *hostinfo\h_addrtype=#AF_INET
        *ptr=PeekI(*hostinfo\h_addr_list)
        If *ptr
          sin_addr=PeekL(*ptr)
        EndIf
        *ptr=0
      EndIf
    Else
      sin_addr=-1
    EndIf
  EndIf
  
  If sin_addr<>-1 And sin_addr<>#INADDR_ANY
    IP = sin_addr
  EndIf
  
  ProcedureReturn IP
EndProcedure

InitNetwork()
Debug IPString(GetIP_HostName("localhost"))

0

3

Сбило с панталыку "length + 1"
Подумал что байт длины строки пишется

Код:
Name   |Extension |Memory consumption |Range 
String |.s        |string length + 1   |unlimited

Когда "вспомнил все" - использовал PeekS()

Код:
Protected Look.s
 Look=PeekS(inet_ntoa_(Station(0)\IP)) +#CR$

А задача такая - сохраненный результат функции inet_addr_("nn.nn.nn.nn") преобразовать обратно в строку

0

4

SadStar написал(а):

сохраненный результат функции inet_addr_("nn.nn.nn.nn") преобразовать обратно в строку

Код:
InitNetwork()
Debug IPString(inet_addr_("127.0.0.1"))

0

5

Ведь чувствовал что вопрос решается просто.
Но полез изобретать велосипед.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как преобразовать строку ASCIIZ в строку Пурика?