Хитрый бит здесь - C не позволяет легко работать с битами, только байты. Я собираюсь предположить, что ваш char
содержит 8 бит (отметьте CHAR_BIT
в limits.h
) - это имеет место почти во всех современных системах. Наименьшее общее кратное 8 и 10 - 40, поэтому вы хотите работать в буфере не менее 40 бит, с которым вы можете выполнять целочисленную арифметику в целом - на практике это означает 64-битный тип. Вот один из способов сделать это: чтение из стандартного ввода и запись в стандартный вывод. Обработка потоков, не кратных длине 40 битов, остается в качестве упражнения.
#include <stdint.h>
#include <stdio.h>
int main(void)
{
int c;
uint_least64_t buffer;
for (;;)
{
buffer = 0;
/* read in 4 10-bit units = 5 8-bit units */
c = getchar(); if (c == EOF) break;
buffer = ((buffer << 8) | c);
c = getchar(); if (c == EOF) break;
buffer = ((buffer << 8) | c);
c = getchar(); if (c == EOF) break;
buffer = ((buffer << 8) | c);
c = getchar(); if (c == EOF) break;
buffer = ((buffer << 8) | c);
c = getchar(); if (c == EOF) break;
buffer = ((buffer << 8) | c);
/* write out the non-parity bits */
putchar((buffer & 0xFF00000000ULL) >> 32);
putchar((buffer & 0x003FC00000ULL) >> 22);
putchar((buffer & 0x00000FF000ULL) >> 12);
putchar((buffer & 0x00000003FCULL) >> 2);
}
/* deal with incomplete block here */
return 0;
}
... Если вы хотите быть по-настоящему умным, вы бы проверили эти биты четности, прежде чем выбросить их, хотя тогда вам придется придумать что-то конструктивное, когда (а не если) контрольная сумма не пройдена.