4

私が取り組んでいるプロジェクト、つまり単純なソフトウェア 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、ヘッダーにもデータにも 6 つ1の連続する が含まれていないことを確認する必要があります。これはビット スタッフィングによって行うことができます。たとえば、5 つ1の s のシーケンスごとにゼロを挿入します。

11111111  

に変換します

111110111  

11111000  

に変換します

111110000

これを効率的に実装したい場合は、1s とs の配列を使用すべきではないと思います。ここでは、データ バイトをs とs0に変換し、配列などに入力する必要がありますが、静的サイズのビットフィールドも適合しないようです。ビット スタッフィングにより、コンテンツの長さが可変になるためです。10

ビット スタッフィングをより効率的に行うには、どのデータ構造を使用できますか?

4

1 に答える 1

1

今この質問を見ましたが、未回答で削除されていないので、回答します。この質問を見て、締めくくりを提供する他の人を助けるかもしれません。

ビット スタッフィング: ここでは、 の最大連続シーケンスは1'sです5。それらの後に追加5 1'sする必要があります。05 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
}

これの問題は、1 が 5 回連続して 10 回を超えると、オーバーフローする可能性があることです。分割してから、ビットを詰めて繰り返す方が良いです。

于 2013-04-25T18:39:16.003 に答える