2014-12-02 3 views
0

Я объявил IP-адрес:C++: скрытый ИНТ на неподписанный символ

int test_ip = (192) | (168<<8) | (33<<16) | (255<<24); 

Тогда мне нужно, чтобы преобразовать его (неподписанный символ *). Я пытаюсь сделать это:

(u_char*)test_ip 

Я использую отладчик VS 2010 C++, чтобы оценить последнее выражение. Выход отладчика для этого выражения:

0xff21a8c0 <Bad Ptr> 

Что я делаю неправильно? Почему Bad Ptr?

+4

'(u_char *) & test_ip' – Borgleader

+1

Ваша ошибка заключалась в преобразовании IP-адреса в указатель, а не в адрес' test_ip'. – SHR

+1

Вы действительно не ищете 'inet_ntoa'? – zwol

ответ

1

Попытка приведения в стиле c даст вам неопределенное поведение, поскольку типы указателей не связаны. Лучше всего использовать статический слепок междунара, по модулю 256.

unsigned char c = static_cast<unsigned char>(test_ip % 256) 

Это будет безопасно, так как стандарт гарантирует размер беззнакового полукокса как 8 бит.

После того, как вы перенесли это приведение в неподписанный символ, укажите адрес этого указателя & c.

Если вы хотите, чтобы другие части test_ip затем объединялись с интегральным разделением и т. Д. Просто следите за тем, чтобы не переполнять неподписанный символ при приеме.

+0

К сожалению, я не могу понять :( – Gooman

+0

Какой бит я не объяснил хорошо? – Bathsheba

+0

Вы имеете в виду это: '(u_char *) & test_ip'? – Gooman

2

Ваше преобразование лучше сделать по типу in_addr данных:

Это окно in_addr так что если вы хотите использовать его на Linux, вам придется повторно объявить его с другим именем.

typedef struct in_addr { 
    union { 
    struct { 
     u_char s_b[4]; 
    } S_un_b; 
    struct { 
     u_short s_w[2]; 
    } S_un_w; 
    u_long S_addr; 
    } S_un; 
}; 

так:

in_addr address; 
address.S_addr = (192) | (168<<8) | (33<<16) | (255<<24); 

address.S_un_b.s_b готов теперь, с массивом 4 байта, представляющих адрес ...

+0

№ п/п Нет. Не может работать из-за упаковки структуры. Массив будет работать. – Bathsheba

+0

'S_addr' is' u_long' но мне нужен весь IP-адрес в одной переменной 'u_char'. – Gooman

+0

Теперь это должно сработать. поскольку массивы не имеют выравнивания. и вы можете получить указатель – SHR

0

Предположительно, вам это нужно как unsigned char* передать его некоторые протоколы. В этом случае вы не можете просто бросить, так как бит бит вашего int не обязательно соответствует ожидаемому протоколу . Вы должны извлечь его byte by byte, точно так же, как , вы его построили, поместив байты в буфер .

Смежные вопросы