4

我正在尝试为我正在从事的项目实施 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的 s。这可以通过位填充来完成,例如在每个五个1s 的序列之后插入一个零:

11111111  

转换为

111110111  

11111000  

转换为

111110000

如果我想有效地实现这一点,我想我不应该使用1s 和0s 的数组,我必须将数据字节转换为1s 和0s,然后填充一个数组等,但静态大小的位域似乎也不适合,因为由于位填充,内容的长度是可变的。

我可以使用哪种数据结构来更有效地进行位填充?

4

1 回答 1

1

我现在才看到这个问题,看到它没有回答也没有被删除,我会继续回答。它可能会帮助其他看到这个问题并提供关闭的人。

位填充:这里的最大连续序列1's5。在那些之后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 个 1 中有 10 个以上,那么它可能会溢出。最好先分割然后再填充并重复。

于 2013-04-25T18:39:16.003 回答