2015-08-24 5 views
1
 addr4 = &((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr; 
     internal_addr = inet_netof(*addr4); 
     printf("IPv4 MASK %08x \n",internal_addr); 

У меня есть код выше. Он печатает МАСКА IPv4, какФункция inet_netof() возвращает странное значение

IPv4 MASK 00ffffff 

Я предполагаю, что это представляет 255.255.255.0. Это правильное предположение? Я хочу, чтобы преобразовать его в 24 (целое число в CIDR нотации)

+0

Да, но для его правильной печати используйте 'printf (« IPv4 MASK% 08x \ n », ntohl (internal_addr));' поскольку все здесь находится в сетевом порядке байтов. –

ответ

1
IPv4 MASK 00ffffff 

Я предполагаю, что это представляет 255.255.255.0. Это правильное предположение?

Это правильно. 00ffffff в сетевом порядке байт становится 0xff 0xff 0xff 0x00, который в свою очередь, становится 255.255.255.0 в dot notation

2

По Вашему желанию, чтобы преобразовать его в количестве маски битов (CIDR нотации), просто подсчитать количество единичных битов в маске.

Просто пропустите через 32-разрядное целое без знака (0x00ffffff), если оно больше 0, если оно больше 0, добавьте 1 к вашему ответу, затем разделите целое число без знака на 2 (или сдвиньте его вправо 1 бит).

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