2014-10-09 16 views
-1

場景:C:轉換比特位置爲十進制

[節點A] < -------- RF界面------> [節點B]

問題:

節點A向6個字節長的節點B發送一個有效載荷。在這個有效載荷中有關於可用插槽的信息,例如,總共有6個字節* 8位= 48個時隙。每個插槽可以是ON 1或OFF 0.

例如,這些插槽編號0,2,5,7都是ON。有效負載的比特表示將是: 10100101000000000 ....直到第48比特。
然後這些信息通過RF接口發送到有效載荷中的節點B.

在節點B,我需要將每個位表示的位置轉換爲數組中的十進制表示(對於某些gui表示形式)。 回到這個例子:
我需要將有效負載的位10100101000000000 ...轉換成數組中的活動槽呈現:例如,

myArray[0] = 1; 
myArray[1] = 0; 
myArray[2] = 1; 
myArray[3] = 0; 
myArray[4] = 0; 
myArray[5] = 1; 
     . 
     . 
myArray[48] = x; 

我不是位掩碼好,所以任何幫助沃爾德理解 感謝所有幫助!

回答

0

根據你的榜樣,我假設位圖,給出6個字節數組是:

unsigned char bitmap[6] = {0xa5, 0x00, 0x00, 0x00, 0x00, 0x00}; 

和結果是發往:

int myArray[48]; 

我將通過myArray的傾斜循環從後到前和基於最低奧德的測試分配的每個值位圖中的r位,然後右移以進行每次循環迭代。

int bmi = 5; // set bitmap index to end 
int mai = 47; // set myArray index to end 
int i = 0; 

while (mai >= 0) { 
    for (i = 0; i < 8; i++) { 
     myArray[mai] = bitmap[bmi] & 0x01; 
     bitmap[bmi] >>= 1; 
     --mai; 
    } 
    --bmi; 
} 
for (mai = 0; mai < 48; mai++) printf("%d", myArray[mai]); 
printf("\n"); 
1

這個怎麼樣?:

char *bitsToArray(char *data, int length) 
    { 
     char *rv = malloc(8*length); 
     int i = 0; 
     for(;i < length; ++i) 
     { 
      int j = 0; 
      for(; j < 8; ++j) 
      { 
       rv[i*8+j] = (data[i]>>j)&1; 
      } 

     } 
     return rv; 
    } 

它首先存儲最低顯著位。如果你想它在相反位順序,則可以行rv[i*8+j] = (data[i]>>j)&1;更改爲rv[i*8+j] = (data[i]>>(7-j))&1;

0
for (int i = 0; i < buffer_size; i++) { 
    for (int j = 7; j >= 0; j--) { // most significant bit first 
     myArray[8 * i + j] = buffer[i] >> j & 1; 
    } 
}