我正在尝试为我正在开发的项目实现bitstuffing,即一个简单的软件AFSK调制解调器。简化的协议看起来像这样:
0111 1110 # burst sequence
0111 1110 # 16 times 0b0111_1110
...
0111 1110
...
... # 80 bit header (CRC, frame counter, etc.)
...
0111 1110 # header delimiter
...
... # data
...
0111 1110 # end-of-frame sequence
现在我需要在接收到的数据中找到保留序列0111 1110
,因此必须确保报头和数据都不包含六个连续的1
。这可以通过比特填充来完成,例如,在五个1
s的每个序列之后插入零:
11111111
转换为
111110111
和
11111000
转换为
111110000
如果我想有效地实现这一点,我想我不应该使用1
和0
s的数组,我必须将数据字节转换为1
和{{ 1}} s,然后填充数组等,但静态大小的位域似乎也不适合,因为内容的长度由于位填充而变化。
我可以使用哪种数据结构更有效地进行位填充?
答案 0 :(得分:1)
我现在刚看到这个问题,看到它没有得到答复而且没有删除我会继续回答。它可能会帮助其他人看到这个问题并提供封闭。
位填充:此处1's
的最大连续序列为5
。在5
1's
之后,0
5
后应附加1's
。
这是执行该操作的C程序:
#include <stdio.h>
typedef unsigned long long int ulli;
int main()
{
ulli buf = 0x0fffff01, // data to be stuffed
temp2= 1ull << ((sizeof(ulli)*8)-1), // mask to stuff data
temp3 = 0; // temporary
int count = 0; // continuous 1s indicator
while(temp2)
{
if((buf & temp2) && count <= 5) // enter the loop if the bit is `1` and if count <= 5
{
count++;
if(count == 5)
{
temp3 = buf & (~(temp2 - 1ull)); // make MS bits all 1s
temp3 <<= 1ull; // shift 1 bit to accomodeate the `0`
temp3 |= buf & ((temp2) - 1); // add back the LS bits or original producing stuffed data
buf = temp3;
count = 0; // reset count
printf("%llx\n",temp3); // debug only
}
}
else
{
count = 0; // this was what took 95% of my debug time. i had not put this else clause :-)
}
temp2 >>=1; // move on to next bit.
}
printf("ans = %llx",buf); // finally
}
这个问题是如果连续5个中有10个超过1,那么它可能会溢出。最好分开然后比特和重复。