Позволяет разбить его на части, начиная с конца:
xBlock << 12
Этот оператор сдвига влево сообщает нам, что размер блока равен 4096, поскольку:
1 << 12 = 1000000000000 (binary) = 4096 (decimal)
Теперь первая часть добавляет константу к размеру заголовка:
MetaData.HeaderSize + 0xFFF
0xFFF равно 4095. Обратите внимание, что это всего на 1 меньше, чем 4096.
1000000000000 (4096 in binary)
0111111111111 (4095 in binary)
Следующая часть теперь очищает младшие 12 бит, так как 0xF000 в двоичном виде:
1111000000000000 (1111 followed by 12 0s)
Итак, насколько я могу судить, происходит следующее:
1) Возьмите размер заголовка и добавьте размер блока - 1
2) Очистить младшие 12 битов, которые округляются до следующего наибольшего ближайшего кратного размеру блока. Я не уверен на 100% в этой части, но я попробовал несколько примеров (001 + 111) & 1000 против (111 + 111) & 1000, и похоже, что это то, что он делает.
3) Текущее значение - то, где начинается смещение для блока 0, поэтому добавьте соответствующее кратное 4096, чтобы получить смещение блока