Почему используется битовая маска 0xFFFF, когда dwLocalPort из структуры PMIB_TCPROW2?

Я нашел этот ответ полезным: Получение PID однорангового сокета в Windows .. но тоже интригующе.

Мне интересно: почему 16 бит замаскированы в row->dwLocalPort & 0xFFFF из 32 битов DWORD в dwLocalPort?

Я знаю, что битмаски используются для добавления большего количества информации в 1 число, но мне кажется, что здесь это не нужно. Я упускаю из виду что-то простое?


person Mindaugas Bernatavičius    schedule 04.12.2017    source источник


Ответы (1)


Согласно MSDN «Максимальный размер номера IP-порта составляет 16 бит, поэтому следует использовать только нижние 16 бит. Верхние 16 бит могут содержать неинициализированные данные».

https://msdn.microsoft.com/en-ca/subscriptions/bb485761.aspx

person Eljay    schedule 04.12.2017
comment
Поэтому мне интересно, почему они оставили эти биты неинициализированными, а не установили их на ноль? - person Mark Ransom; 04.12.2017
comment
@MarkRansom • мы можем обвинить моего коллегу Рэймонда Чена. Его часто обвиняют в беспорядках других разработчиков. (Я шучу! Я шучу! Рэймонд великолепен. Он один из стойких сторонников, которые поддерживают обратную совместимость Windows, насколько это возможно.) - person Eljay; 04.12.2017
comment
Я знаю, малыш, Рэймонд Чен — один из моих героев. Он даже время от времени публикует сообщения на StackOverflow, я не знаю, как он находит время. - person Mark Ransom; 04.12.2017
comment
Не видел этого объяснения раньше, большое спасибо. Тем не менее, я думаю, что очистка битов - это не их и, а отрицание, а затем и (x & ~ x)? - person Mindaugas Bernatavičius; 04.12.2017
comment
@MindaugasBernatavičius • ~x — это оператор побитового дополнения. (x & ~x) равно 0 ... так что, вероятно, происходило что-то похожее, но другое. `& 0xFFFF — это маска, разрешающая только младшие 16 бит. - person Eljay; 04.12.2017
comment
Извините, я понял это сейчас ... FFFF - это 16 младших битов, установленных на 1, и 16 старших битов, установленных на 0. Поскольку мы хотим, чтобы 0 из старших 16 бит в DWORD, нам нужно установить младшие биты на 1 в маска и старшие биты в 0, так как И со всеми 1 всегда сохраняет исходные биты в замаскированном значении. - person Mindaugas Bernatavičius; 04.12.2017