2010-11-04 1 views
3

Если у меня есть адрес 4 байт хранится в полукокса адрес [4], а содержание:Преобразование IP-адреса 4 байтов в стандартной точечно-десятичной нотации

address[0] = '\x80'; 
address[1] = '\xAB'; 
address[2] = '\x0A'; 
address[3] = '\x1C'; 

// all together: 80 AB 0A 1C 

Я хочу, чтобы преобразовать его в массив символов, выглядит как «128.171.10.28», так как 80 в шестнадцатеричном виде равно 128, AB в шестнадцатеричном состоянии равно 171 и так далее.

Как я могу это сделать?

+0

«Преобразование 4-байтного IP-адреса в шестнадцатеричном виде в массив символов» - это неправильный вопрос - это уже «массив символов». Что вы имеете в виду, так это то, что вы хотите получить текстовое представление в стандартном десятичном десятичном обозначении IP. Тема изменена соответствующим образом. –

ответ

9
char saddr[16]; 
sprintf(saddr, "%d.%d.%d.%d", (unsigned char)address[0], (unsigned char)address[1], (unsigned char)address[2], (unsigned char)address[3]); 

или

char saddr[16]; 
unsigned char *addr = (unsigned char*)address; 

sprintf(saddr, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); 

или, как указал dreamlax:

char saddr[16]; 
sprintf(saddr, "%hhu.%hhu.%hhu.%hhu", address[0], address[1], address[2], address[3]); 
+0

'% hhu' будет лучшим спецификатором для каждого компонента адреса, так как именно это вы даете' sprintf'. – dreamlax

+0

Ваш трюк неверен. Вам необходимо передать 'unsigned char *' ** до ** разыменования указателя, а не потом. После этого происходит определенное поведение, которое может привести к некорректному сигналу или преобразованию (в системах без двоичного дополнения). –

+0

И, конечно, было бы лучше просто использовать правильный тип ('unsigned char [4]' или 'uint8_t [4]') для начала. –

5

IP-адрес - это только отдельные октеты, напечатанные как десятичные числа, разделенные символом a.

printf("%d.%d.%d.%d",address[0],address[1],address[2],address[3]); 

Вы, вероятно, должны сделать свой char address[4]unsigned char address[4]

+0

Мне не нужно его распечатывать. Мне нужен весь адрес, который будет храниться в другом массиве символов, который содержит символы {1,2,8,., 1,7,1,., 1,0,., 2,8} – MBU

+0

Это дает "-128" для первого символа, если вы не измените тип массива на 'unsigned char', как рекомендовано. – sje397

+0

@MikeU: найдите функцию, которая печатает строку в переменной. Кроме того, строки являются массивами char –

-1

Использование% U будетдаже лучше.

+0

Это дает ошибку «обнаружение разбития стека», компиляция с gcc. – sje397

+0

% u следует использовать только для неподписанных данных - это сообщение означает, что буфер sprintf переполнен, что, вероятно, означает, что ваши типы не согласны. – 0xDEADBEEF

+0

Мартин - не мои типы, но типы, используемые в вопросе. '% u' ожидает значения' unsigned int'. – sje397

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