The problem with your code is that the data in the buff
is ASCII characters, not the individual binary digits. You need to subtract '0'
from each digit before performing a conversion to BCD:
uint8_t HourTens = (buff[0] - '0'); // && 0xF0, will be 1
Note that each element takes its own byte, so you don't need to mask anything.
uint8_t HourBCD = ((buff[0] - '0') << 4) | (buff[1] - '0');
Also note that since the digits are from zero to nine, all you need to do is to shift the upper digit by four to get a valid BCD representation.