Ваше описание проблемы может относиться к некоторому коду, но я думаю, что вы можете столкнуться с проблемой порядка байтов. Это может объяснить, почему ваши сдвиги и маскировка не сделали то, что вы думали, потому что вы на самом деле работаете не с тем байтом.
Семейство функций hton и ntoh переключается на и от имени хоста и сети (big endian). Посмотрите htons, ntohs, htonl и ntohl для получения дополнительной информации. Эти функции на самом деле ничего не делают, если на главном компьютере есть порядок байтов, но многие (например, x86) имеют порядок байтов. На компьютере с прямым порядком байтов htons (0x1234) приведет к 0x3412, потому что это меняет местами байты.
Так как я не знаю, как выглядит поток вашей программы, вот моя лучшая попытка наглядного примера.
uint16_t set_those_bits(uint16_t x) {
uint16_t mask = htons(0x0F00);
return x | mask;
}
Эта функция не изменяет порядковый номер данных, передаваемых относительно возвращаемого значения, но предполагает, что значение является порядковым номером сети, поэтому меняет порядковый номер маски с порядкового номера узла на сеть, а затем устанавливает эти биты в результате.
uint16_t clear_those_bits(uint16_t x) {
uint16_t mask = htons(0xF0FF);
return x & mask;
}
uint16_t toggle_those_bits(uint16_t x) {
uint16_t mask = htons(0x0f00);
return x ^ mask;
}