Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите c конвертированием строки


User1 ©   (2004-11-26 17:53:00) 

Уважаемые мастера, помогите пожалуйста с конвертированием LocalIP:String в IP:array of byte.

Нашел функцию определения локального ip адресса:

function LocalIP: string;
type
TaPInAddr=array [0..10] of PInAddr;
PaPInAddr=^TaPInAddr;
var
phe:PHostEnt;
pptr:PaPInAddr;
Buffer:array [0..63] of char;
i:Integer;
GInitData:TWSADATA;
begin
WSAStartup($101, GInitData);
Result:='';
GetHostName(Buffer, SizeOf(Buffer));
phe:=GetHostByName(buffer);
if phe=nil then Exit;
pptr:=PaPInAddr(Phe^.h_addr_list);
i:=0;
while pptr^[i]<>nil do
 begin
  result:=StrPas(inet_ntoa(pptr^[i]^));
  Inc(i);
 end;
WSACleanup;
end;


Тока вот результат мне нужен в виде 4 байт!
Подскажите пожалуйста кодом как ето сделать!
Заранее спасибо.


Verg   (2004-11-27 14:59:00) [1]

Ф-ция эта называется inet_addr. Описана в WinSock. Зачем изобретать велосипед?


User1   (2004-11-27 11:43:00) [2]

Большое спасибо.

> // Тут желательно проверять - а то вдруг больше 255?

В данном случае ето помоему не обязательно. функция LocalIP:String выдает результат в корректном формате.. покрайней мере надеюсь что так! Единественое помоему надо проверить чтоб LocalIP <> '';


begin...end   (2004-11-27 08:54:00) [3]


> [3] User1   (27.11.04 00:44)


> Масив из 4-х байт? я помоему написал, что результат нужен
> ввиде 4 байта...

Вот Ваши слова:

> с конвертированием LocalIP:String в IP: array of byte

А вот решение:

var
 LocalIP: String;
 IP: array [0..3] of Byte;
 I: Byte;
begin
 LocalIP := '192.168.0.1';
 with TStringList.Create do
   try
     Delimiter := '.';
     DelimitedText := LocalIP;
     if Count = 4 then
       for I := 0 to 3 do
         IP[I] := StrToInt(Strings[I]) // Тут желательно проверять - а то вдруг больше 255?
   finally
     Free
   end
end.


Ильичев С.А.   (2004-11-27 02:29:00) [4]

2: [3] User1   (27.11.04 00:44)

Что же тебя не устраивает-то ?
В [2].
Пользуйся на здоровье.


User1   (2004-11-27 00:44:00) [5]


> Есть какая-то строка. Нужно её превратить в массив из 4-х
> байт.


я ж не писал что есть какаято строка и надо превратить в непонятно что!,.. у меня есть ip в формате: '192.168.0.1' например (ето делает функция что я привел в [0])! мне надо мой айпи конвертнуть в 4 байта. т.е каждое число между точками - ето 1 байт!
Масив из 4-х байт? я помоему написал, что результат нужен ввиде 4 байта... помоему дополнять нечего!.. итак ясно, что айпи - ето 4 цифры в диапазоне от 0 до 255 или последовательность из 4 байт!


Ильичев С.А.   (2004-11-26 21:45:00) [6]

А я вот кажется понял что имел в виду автор.

Накидал функцию, а как проверить не знаю.


function _f(const S: ShortString): LongWord;
const
 TO4KA = '.';
 BitsInByte = 8; // :-)
var
 tmpStr: String;
 a, _shift: LongWord;
begin
 Result := 0;
 _shift := SizeOf(Result) * BitsInByte;
 tmpStr := S + TO4KA;
 while Pos(TO4KA, tmpStr) > 0 do
 begin
   a := StrToInt(Copy(tmpStr, 1, Pos(TO4KA, tmpStr) - 1));
   Delete(tmpStr, 1, Pos(TO4KA, tmpStr));
   dec(_shift, BitsInByte);
   Result := Result or (a shl _shift);
 end;
end;


вызывать, например, так:

...
... := _f('192.168.0.1');
...


проверка соответствия передоваемого параметра на совеститого кто будет использовать


begin...end   (2004-11-26 18:57:00) [7]


> User1   (26.11.04 17:53)

Есть какая-то строка. Нужно её превратить в массив из 4-х байт.

Не обижайтесь, но как Вы сами представляете ответ на свой вопрос?


Наверх

Титульная страница Поиск, карта сайта Написать письмо