假设我有一个比特流,其中包含8位数据,后跟2个奇偶校验位(模式重复).
示例(x是奇偶校验位):
0001 0001 xx00 0100 01xx 0001 0001 xx00 ...
应该成为
0001 0001 0001 0001 0001 0001 ...
我觉得这应该很容易,我只是在考虑它,但你如何去剥离这些奇偶校验位呢?
这里棘手的一点是C不会让你容易使用位,只有字节.我将假设您char保留8位(签CHAR_BIT入limits.h) - 几乎所有现代系统都是如此.8和10的最小公倍数是40,所以你想在至少40位的缓冲区中工作,你可以在整体上进行整数运算 - 实际上这意味着64位类型.所以这是一种方法,从stdin读取并写入stdout.处理长度不是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;
}
Run Code Online (Sandbox Code Playgroud)
...如果你想变得非常聪明,你会在把它们扔掉之前检查那些奇偶校验位,尽管那时你必须想出一些建设性的东西,当(而不是)校验和失败时.