Разъяснение соответствия фильтра 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
Другие вопросы по тегам