オクテット文字列に入力する必要がある異なるビット長の 65 個のパラメーターがあります。パラメータは、オクテット文字列で連続して埋められます。たとえば、最初のパラメータが 1 ビット長であると仮定すると、オクテット文字列の 1 番目のオクテットの 0 番目のビット位置で埋められます。ここで、2 番目のパラメーターは 9 ビットの長さとします。したがって、このパラメーターの最初の 7 ビットは同じオクテットで埋められ、次の 2 ビットは次のオクテットの 0 番目と 1 番目のビット位置に移動する必要があります。同様に、他のパラメーターはオクテット文字列に入力されます。現在のオクテットへのポインター、ビット位置、およびデータがコピーされるソースポインターを渡す関数を作成しようとしました。しかし、私はロジックの実装に困難を感じています。多数のロジック (ビット操作、ビット シフト、ローテーションなど) を試しましたが、正しいロジックを取得できませんでした。誰かがそうするために「C」でロジック/機能を教えてくれれば幸いです。別の関数プロトタイプも使用できます。
次のように16ビットのコードを書きました:
void set16BitVal(U8** p_buf, U8* bitPos, U16 src)
{
U16 ctr;
U16 bitVal;
U16 srcBitVal;
U16 tempSrc = src;
U8 temp = **p_buf;
printf("\n temp = %d\n", temp);
for(ctr=0; ctr<16; ctr++)
{
bitVal = 1;
bitVal = bitVal << ctr;
srcBitVal = src & bitVal;
temp = temp | srcBitVal;
**p_buf = temp;
if(srcBitVal)
srcBitVal = 1;
else
srcBitVal = 0;
printf("\n bit = %d, p_buf = %x \t p_buf=%d bitPos=%d ctr=%d srcBitVal = %d\n",\
tempSrc, *p_buf, **p_buf, *bitPos, ctr, srcBitVal);
*bitPos = (*bitPos+1)%8; /*wrap around after bitPos:7 */
if(0 == *bitPos)
{
(*p_buf)++; /*jump to next octet*/
temp = **p_buf;
printf("\n Value of temp = %d\n", temp);
}
//printf("\n ctr=%d srcBitVal = %d", ctr, srcBitVal);
printf("\n");
}
}
しかし、問題は、src=54647 を渡すと、次の出力が得られることです。
温度 = 0
ビット = 54647、p_buf = bf84da4b p_buf=1 bitPos=0 ctr=0 srcBitVal = 1
ビット = 54647、p_buf = bf84da4b p_buf=3 bitPos=1 ctr=1 srcBitVal = 1
ビット = 54647、p_buf = bf84da4b p_buf=7 bitPos=2 ctr=2 srcBitVal = 1
ビット = 54647、p_buf = bf84da4b p_buf=7 bitPos=3 ctr=3 srcBitVal = 0
ビット = 54647、p_buf = bf84da4b p_buf=23 bitPos=4 ctr=4 srcBitVal = 1
ビット = 54647、p_buf = bf84da4b p_buf=55 bitPos=5 ctr=5 srcBitVal = 1
ビット = 54647、p_buf = bf84da4b p_buf=119 bitPos=6 ctr=6 srcBitVal = 1
ビット = 54647、p_buf = bf84da4b p_buf=119 bitPos=7 ctr=7 srcBitVal = 0
temp の値 = 0
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=0 ctr=8 srcBitVal = 1
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=1 ctr=9 srcBitVal = 0
ビット = 54647、p_buf = bf84da4c p_buf=0 ビット位置 = 2 ctr = 10 srcBitVal = 1
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=3 ctr=11 srcBitVal = 0
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=4 ctr=12 srcBitVal = 1
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=5 ctr=13 srcBitVal = 0
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=6 ctr=14 srcBitVal = 1
ビット = 54647、p_buf = bf84da4c p_buf=0 bitPos=7 ctr=15 srcBitVal = 1
temp の値 = 0
ただし、予想される出力は次のとおりです。次のバイトは、src の 8 ビット目以降の値で埋め始める必要があります。
誰かがそれを整理するのを手伝ってくれますか?