簡體   English   中英

將字節轉換為位數組? C

[英]Turn byte into array of bits? C

我想當時讀取二進制文件字節,然后將該字節的位存儲到整數數組中。 同樣,我想將 1 和 0(其中 8 個)的整數數組作為字節寫入二進制文件?

如果您有字節數組:

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]

然后,我們執行邏輯AND清除除所需位以外的所有位。

(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);
}

我們首先要清除字節數組,因為我們將一次將每個字節設置為一位。

然后我們討論一下:

bits[i]

將其移至其位置:

bits[i] << (i % 8)

然后使用邏輯或來設置適當的字節;

在大小為 'sz' 的字節數組 'input' 上完成這項工作的簡單 C 程序是:

int i=0,j=0;
unsigned char mask = 0x01u;    

for (i=0;i<sz;i++)
        for (j=0;j<8;j++)
           output[8*i+j]=((unsigned char)input[i] >> j) & (unsigned char)(mask);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM