2016-11-03 8 views
-4

私は長いビットストリームを持ち、その先頭にvoidポインタを持っています。このビットストリームから、ビット位置 'm'から 'n'ビットを抽出したいと思います。ビットストリームから特定のビットを抽出します。ビットストリームの開始位置にvoidポインタが指定されています

たとえば、57番目のビット位置から75ビットを抽出したいとします。これを行う方法?

voidポインターをcharポインターに型キャストしてから、m/8までインクリメントしてみました。ここから、ここから抜き出す方法についての手がかりはありません。

Cでこのようなビットストリームを使用するにはどうすればよいですか?

私はここでコードを書いていないので、私は進歩する方法がわからず、ここでは理解できない場所がないためです。

+2

ようこそスタックオーバーフロー!コード作成サービスではないので、これまでに何をしているのか、直面している問題とサンプルデータを伝える必要があります。 http://stackoverflow.com/help/how-to-ask –

+0

ここでは、文字ポインタを介して特定のビットにアクセスすることについての質問です。それはあなたの質問に答えることはありませんが、それはあなたに進める方法のアイデアを与えるかもしれません。 http://stackoverflow.com/questions/7607224/how-do-you-reset-a-bit-value-in-a-string –

答えて

0

ここでは、EXTRACT_OFFSET(ここでは57)で始まるビット(ここでは75)のバイト配列から抽出する簡単で最適化されていないソリューションです。

は、要求された​​がbitArray[]を指している場合は(-1)を返します。それ以外の場合は、抽出されたビットの値を返します。

#include <stdio.h> 

int getBit(unsigned char bitArray[], int lenArray,int bitIndex) 
{ 
    int iBytePos = bitIndex >> 3; 
    int iByteBit = bitIndex % 8; 
    unsigned char uByteVal; 

    if (iBytePos > lenArray) { 
     return (-1); 
    } 
    uByteVal = bitArray[ iBytePos ]; 
    if (iByteBit==0) printf("."); // to mark the 8bits border 
    if ((uByteVal & (0x80 >> iByteBit)) != 0) { 
     return (1); 
    } 
    return (0); 
} 

#define ARRAY_SIZE (18) 
#define EXTRACT_OFFSET (57) 
#define EXTRACT_COUNT (75) 

int main() 
{ 
    unsigned char tabByte[ARRAY_SIZE] = { 
     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xFF, 
     0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x00 }; 

    int iVal,iCount; 

    iCount=0; 
    for(int i=0;i<EXTRACT_COUNT;i++) 
    { 
     iVal = getBit(tabByte,ARRAY_SIZE,i+EXTRACT_OFFSET); 
     if (iVal >= 0) { 
      iCount++; 
      printf("%1d",iVal); 
     } 
    } 
    printf("\niCount=%d\n",iCount); 
    return (0); 
} 
関連する問題