在C中剥去奇偶校验位

假设我有一个比特流,其中包含8位数据,后跟2个奇偶校验位(模式重复)。

示例(x是奇偶校验位):

0001 0001 xx00 0100 01xx 0001 0001 xx00 …

应该成为

0001 0001 0001 0001 0001 0001 …

我觉得这应该很简单,我只是在思考它,但你如何去剥离这些奇偶校验位呢?

这里棘手的一点是C不会让你容易使用位,只有字节。 我将假设你的char保存8位(检查limits.h CHAR_BIT ) – 几乎所有现代系统都是这种情况。 8和10的最小公倍数是40,所以你想在至少40位的缓冲区中工作,你可以在整体上进行整数运算 – 实际上这意味着64位类型。 所以这是一种方法,从stdin读取并写入stdout。 处理长度不是40位的倍数的流被留作练习。

 #include  #include  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; } 

…如果你想变得非常聪明,你会在把它们扔掉之前检查那些奇偶校验位,尽管那时你必须想出一些建设性的东西,当(而不是)校验和失败时。

我将在C中定义一个位域结构,然后使用它来“框架”数据缓冲区,只提取有用的位。 像这样的东西:

 struct tframe { unsigned data: 8; unsigned control: 2; } struct tframe * frames = &buf; /* Iterate and write 'data' field to wherever */ ... 

您正在使用自己的数据,因此代码可移植性不会成为问题。