我有一个8位数据加1位奇偶校验位的缓冲区这种模式是重复的缓冲区当前存储为八位字节数组。
示例(p是奇偶校验位):
0001 0001 p000 0100 0p00 0001 00p01 1100。。。
应该变成
0001 0001 0000 1000 0000 0100 0111 00。。。
基本上,我需要去除每九个位来获得数据位。我怎样才能做到这一点?
这与以前在这里询问的another question有关。
这是在32位计算机上,因此相关问题的解决方案可能不适用。最大可能位数是45,即5个数据八位字节。
这就是我到目前为止所做的努力我已经创建了一个“布尔”数组,并根据八位字节的位集将位添加到数组中然后,我查看数组的每九个索引,并通过它离开然后将剩余的数组下移一个索引我只剩下数据了我在想也许有更好的办法。
最佳答案
你的想法有一个数组位是好的。只需通过32位数字(缓冲区)实现位数组。
要从缓冲区中间删除一位:
void remove_bit(uint32_t* buffer, int* occupancy, int pos)
{
assert(*occupancy > 0);
uint32_t high_half = *buffer >> pos >> 1;
uint32_t low_half = *buffer << (32 - pos) >> (32 - pos);
*buffer = high_half | low_half;
--*occupancy;
}
要向缓冲区添加字节,请执行以下操作:
void add_byte(uint32_t* buffer, int* occupancy, uint8_t byte)
{
assert(*occupancy <= 24);
*buffer = (*buffer << 8) | byte;
*occupancy += 8;
}
要从缓冲区中删除字节,请执行以下操作:
uint8_t remove_byte(uint32_t* buffer, int* occupancy)
{
uint8_t result = *buffer >> (*occupancy - 8);
assert(*occupancy >= 8);
*occupancy -= 8;
return result;
}
您必须安排调用,使缓冲区永远不会溢出。例如:
buffer = 0;
occupancy = 0;
add_byte(buffer, occupancy, *input++);
add_byte(buffer, occupancy, *input++);
remove_bit(buffer, occupancy, 7);
*output++ = remove_byte(buffer, occupancy);
add_byte(buffer, occupancy, *input++);
remove_bit(buffer, occupancy, 6);
*output++ = remove_byte(buffer, occupancy);
... (there are only 6 input bytes, so this should be easy)
关于c - 从8位数据后跟1位奇偶校验位中剥离C中的奇偶校验位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10978215/