[英]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.