Убрать биты четности в C - PullRequest
3 голосов
/ 30 июня 2011

Скажем, у меня есть поток битов с 8 битами данных, за которыми следуют 2 бита четности (повторение шаблона).

Пример (x - биты четности):

0001 0001xx00 0100 01xx 0001 0001 xx00 ...

должно стать

0001 0001 0001 0001 0001 0001 ...

Я чувствую, чтоэто должно быть легко, и я просто задумываюсь над этим, но как вы собираетесь избавиться от этих битов четности?

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

Хитрый бит здесь - 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;
}

... Если вы хотите быть по-настоящему умным, вы бы проверили эти биты четности, прежде чем выбросить их, хотя тогда вам придется придумать что-то конструктивное, когда (а не если) контрольная сумма не пройдена.

0 голосов
/ 30 июня 2011

Я бы определил структуру битового поля в C, а затем использовал бы ее для «кадрирования» буфера данных, извлекая только полезные биты. Примерно так:

struct tframe {
     unsigned data: 8;
     unsigned control: 2;
}

struct tframe * frames = &buf;

/* Iterate and write 'data' field to wherever */
...

Вы работаете со своими собственными данными, поэтому переносимость кода не будет проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...