Разъяснение соответствия фильтра u32
Я следил за учебником для сопоставления с шаблоном u32 здесь: Ссылка
Большая часть этого проста, пока я не доберусь до секции, где длина IP-заголовка получена, используя следующее:
0>>22&0x3C
Я не понимаю, почему это было выбрано вместо:
0>>24&0x0F
Насколько я понимаю, выбранный фильтр сместит первый байт 22 вправо, а затем применит маску, чтобы убрать первый и последние 2 бита, что даст нам правильный нижний кусок для длины заголовка IP. Второй завершит полный сдвиг вправо, нужно только удалить первые 4 бита.
Мой вопрос: почему был выбран первый, а не второй? Я полагаю, что это происходит из-за умножения, но я не понимаю, какой эффект будет иметь эта операция, если оба фильтра вернут правильное значение.
1 ответ
Длина заголовка IP указывается в 32-битных словах, а не в 8-битных байтах, поэтому любое значение в поле IP H необходимо умножить на 4, что может быть достигнуто сдвигом влево на 2; поэтому вместо смещения вправо на 24, маскирования на 0x0F и смещения вправо на два автор решил только сместить вправо на 22 и маскировать на 0x03c.
То есть обе операции не возвращают одно и то же значение, первая операция возвращает значение второй, умноженное на 4. Чтобы получить тот же результат, что и первую, вы бы
0>>24&0x0F<<2