В C вы можете манипулировать битами с помощью побитовых операторов, таких как &
и |
, а также операторов сдвига битов <<
и >>
.
Например, чтобы отключить старший бит данного байта, вы можете сделать это.
char c = 0xBF; // initial value is bit pattern 10111111
c &= 0x7F; // perform AND against the bit pattern 01111111
// final value is bit pattern 00111111 (0x3F)
Это имеет смысл?
Очевидно, вам нужно иметь возможность преобразовывать битовый паттерн в шестнадцатеричный, но это не так уж сложно.
Вы можете использовать похожую маскировку для извлечения нужных битов и помещения их в выходной буфер.
Обновление:
У вас есть 64 бита (8 байтов) ввода, и вы хотите 56 бит (7 байт) вывода.
Давайте представим ваши входные данные следующим образом, где каждая буква представляет один бит
Буквы «х» - это те, которые вы хотите выбросить.
xAAAAAAA xBBBBBBB xCCCCCCC xDDDDDDD xEEEEEEE xFFFFFFF xGGGGGGG xHHHHHHH
Итак, вы хотите, чтобы ваш окончательный ответ был:
AAAAAAAB BBBBBBCC CCCCCDDD DDDDEEEE EEEFFFFF FFGGGGGG GHHHHHHH
Так что в C у нас может быть такой код:
unsigned char data[8] = {/* put data here */};
// chop off the top bit of the first byte
data[0] <<= 1;
// the bottom bit of data[0] needs to come from the top data bit of data[1]
data[0] |= (data[1] >> 6) & 0x01;
// use similar transformations to fill in data[1], data[2], ... data[6]
// At the end, data[7] will be useless
Конечно, это совсем не оптимизировано, но, надеюсь, вы поняли идею.