Intereting Posts
Ошибка: в C получена ошибка «разыменования указателя на неполный тип» в указателе структуры В чем разница между статической глобальной и статической изменчивой переменной? Atmelstudio UC3C AVR32 – объекты инфраструктуры в неправильном месте в памяти? Какой тип данных C может представлять собой 40-битное двоичное число? C – Выполнение команд Bash с помощью Execvp R внешний интерфейс Почему int * float быстрее, чем int / int? Как преобразовать строку ac в свою экранированную версию в c? fseek для 32-разрядного беззнакового смещения Компрессор ASCII работает для короткого тестового файла, а не на длинных Временная метка препроцессора Встроенная assembly в программе C на x86_64 linux Реализация hash-таблицы ANSI C с данными в одном блоке памяти Принуждение определенных переменных, генерируемых компилятором, в определенные секции ELF (с gcc) Сортировка Radix с использованием очереди

c для действительной сетевой маски

Есть ли способ проверить, что 32-разрядная сетевая маска действительна или не используется побитовым оператором?

Я должен проверить со стороны msb, что ‘1’ находятся в непрерывном streamе или нет. например, 11111111.0.0.0 (255.0.0.0), но 11111101.0.0.0 (253.0.0.0) – нет.

Первое, что нужно сделать, это проверить, что сетевая маска не равна нулю (неприятный случай края). Учитывая, что это нормально, вам нужно взять побитовое обратное.

uint32_t y = ~x; 

Затем добавьте один

 uint32_t z = y + 1; 

Тогда, если x была правильной сетевой маской, в ней будет установлено не более 1 бит.

Чтобы проверить это, просто и z с z - 1 , который является y . Результат будет равен нулю, если все в порядке, в противном случае – ноль.

 valid = (z & y) == 0; 

Чтобы проверить недопустимую сетевую маску, вы можете использовать следующий простой алгоритм:

 mask & (~mask >> 1) 

Это будет оцениваться в 1 для недопустимой сетевой маски и 0 для действительной сетевой маски.

Действительная сетевая маска не может иметь нуль с одним справа от нее. Все нули должны иметь еще один нуль справа от него или быть бит 0. Если вы возьмете дополнения (~) сетевой маски, которая имеет нуль с одним справа от нее и сдвинет ее вправо на одну битовую позицию , вы выровняете один в сетевой маске с одним в дополненном дополнением к сетевой маске. И эти два значения вместе приведут к тому, что указывает на недопустимую сетевую маску.

Обязательно используйте ntohl (), чтобы преобразовать сетевую маску в порядок байтов хоста перед применением этого алгоритма, если он находится в сетевом порядке байтов. Кроме того, вам нужно сделать специальные проверки для 0xffffffff и 0x00000000, если вы хотите их исключить.

Примечание. Из-за правил приоритета и правил ассоциативности для операторов скобки, указанные в алгоритме, не нужны, но я добавил их, чтобы сделать код более понятным, если вы не всегда помните правила приоритета и ассоциативности.

 int is_netmask_valid(uint32_t mask) { if (mask == 0) return 0; if (mask & (~mask >> 1)) { return 0; } else { return 1; } }