2017-01-17 11 views
-1

私はその時点でバイナリファイルバイトを読み込み、そのバイトのビットを整数配列に格納したいと考えています。同様に、1と0の整数配列(8個)をバイトとしてバイナリファイルに書きたいのですか?あなたはバイトの配列がある場合はバイトをビットの配列に変換しますか? C

+0

I/Oはビット単位でほとんど機能しません。私が知っている限り、関数の読み取りと1のバッファサイズで1バイトずつ読むことができます。 – chris01

+0

1のビットマスクを使用して入力に沿ってクロールすることはできますが、実質的に32ビットである。 8ビットのグループを格納するchar配列を試して、ビットシフトとマスクを使って個々のビットにアクセスすることができます。 – synchronizer

+0

ビットシフトとビット単位操作について聞いたことがありますか? –

答えて

3

unsigned char bytes[10]; 

をそしてビットの配列にそれを変更したい:

unsigned char bits[80]; 

そして、あなたはバイトあたり8ビットを持っていると仮定すると、これを試してみてください。

int i; 
for (i=0; i<sizeof(bytes)*8; i++) { 
    bits[i] = ((1 << (i % 8)) & (bytes[i/8])) >> (i % 8); 
} 

このループでは、iは合計ビット数でループします。与えられたビットが生きるバイトはi/8であり、これは整数の除算で切り捨てられます。バイト内のビットの位置はi%8です。

まず私たちは、所望のビットのためのマスクを作成します。次に

1 << (i % 8) 

希望のバイト:

bytes[i/8] 

その後、我々は論理を実行し、私たちが望む1以外のすべてのビットをクリアします。

(1 << (i % 8)) & (bytes[i/8]) 

次に、結果をビット位置で右シフトして、最下位ビットに希望のビットを入れます。これにより、1または0の値が与えられます。

配列がunsignedであることにも注意してください。これはビットシフトが適切に機能するために必要です。

戻すには:

int i; 
memset(bytes, 0, sizeof(bytes)); 
for (i=0; i<sizeof(bytes)*8; i++) { 
    bytes[i/8] |= bits[i] << (i % 8); 
} 

は、我々は一度に各バイトの1ビットをセットすることがありますから、バイト配列をクリアすることによって開始します。

その後、我々は問題のビットを取る:その位置に

bits[i] 

は、Shiftキーを:

bits[i] << (i % 8) 

次に論理を使用するか、適切なバイトを設定します。

関連する問題