Вы можете прочитать 3 байта из вашего потока следующим образом:
unsigned char buf[3];
f.read(reinterpret_cast<char*>(buf), 3);
Тогда у вас будет 3 байта, как показано красным:
Вам нужны два новых 12-битных семпла, показанных синим цветом, с пометкой n0
и n1
:
Но вы хотите уменьшить их до 8-битных, поэтому вам нужно отбросить младшее 4-битное шоу зеленого цвета с метками d0
и d1
. Это оставит вас с двумя новыми 8-битными семплами, показанными пурпурным и помеченными a0
и a1
:
a0 = b[0];
a1 = (b[1] & 0xf) << 4) | ((b[2] >> 4) & 0xf);