joynter |
Отправлено: 07.10.2004, 17:26 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
есть такая структура
CODE |
struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
}
|
меня интересует, что это за тип данных char FAR * FAR * и как его привести к AnsiString? |
|
Pirs |
Отправлено: 07.10.2004, 19:15 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 39
|
указатель на указатель, то есть двумерный массив.
Привести к String можно не этот указатель, а один из РЕАЛЬНО существующих индексов. Понятно, что сам указатель и все входящие в него строки должны быть сперва созданы через new.
Srting str = h_aliases [ any_real_index ] ;
|
|
joynter |
Отправлено: 08.10.2004, 10:07 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
извините, я выразился не очень корректно.
я имел в вмду следующее:
CODE |
struct hostent* any_host;
WSADATA wsaData;
String ip,s="http://www.yandex.ru";
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
{
Memo1->Lines->Add ("Winsock not be started");
WSACleanup();
}
else
Memo1->Lines->Add("Winsock started");
any_host = gethostbyname(s.c_str());
Memo1->Lines->Add(any_host->h_addr[0]);
Memo1->Lines->Add(any_host->h_addr[1]);
Memo1->Lines->Add(any_host->h_addr[2]);
Memo1->Lines->Add(any_host->h_addr[3]);
WSACleanup();
|
так вот в Memo1 выводится белиберда вместо IP.
т.е. вопрос звучит так — как из network byte order сделать AnsiString? |
|
Konstantine |
Отправлено: 08.10.2004, 10:30 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
если Я правильно понял то попробуй так:
CODE | Memo1->Lines->Add(IntToStr(any_host->h_addr[0])); |
|
|
joynter |
Отправлено: 08.10.2004, 10:48 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
это первое, что я сделал — не помогло |
|
AVC |
Отправлено: 08.10.2004, 10:50 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Кусок из рабочей программы. Авось сгодится.
CODE |
char *buf;
int i;
struct hostent *hret = gethostbyname(str.c_str());
...
for (i=0, buf=hret->h_addr_list[i]; buf; i++, buf=hret->h_addr_list[i])
{ str += "\r\n " + AnsiString(i) + ". <" +
AnsiString(int((buf[0]) & 0xFF)) + "." +
AnsiString(int((buf[1]) & 0xFF)) + "." +
AnsiString(int((buf[2]) & 0xFF)) + "." +
AnsiString(int((buf[3]) & 0xFF)) + ">"
;
}
|
|
|
joynter |
Отправлено: 08.10.2004, 11:28 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
2AVC: спасибо
я бы не одну пару мозгов издумал, чтобы выдать "AnsiString(int((buf[0]) & 0xFF))"
интересен ход программистской мысли — поделитесь, если не напряжно.
конкретнее: интересует (buf[0]) & 0xFF
Отредактировано joynter — 08/10/2004, 12:33 |
|
Konstantine |
Отправлено: 08.10.2004, 11:50 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
это преобразование к [B]unsigned char[\B] должно получиться и без него если в начале объявить так:
или
|
|
AVC |
Отправлено: 08.10.2004, 11:53 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE | интересует (buf[0]) & 0xFF |
в char старший разряд — знаковый и при преобразовании в int заполняет собой все левые биты, а 0xFF обрезает int опять до младшего байта. (Кстати, обычная практика на чистом C. Оттуда и привычка)
Можно обойти, поставив другие типы. |
|
joynter |
Отправлено: 08.10.2004, 12:05 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
спасибо — все очень доходчиво объяснили
Отредактировано joynter — 08/10/2004, 13:09 |
|