2010-03-05 56 views
0

我需要知道如何將位放入字符數組中。如何將位放入字符陣列

例如,

我想把0001位轉換成使用C或C++的字符陣列。

需要你的幫助球員。謝謝。

+1

對於位twiddling請參閱http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c – SiegeX 2010-03-05 01:57:44

+0

@Ragy:讓我們說我們想要寫一個函數來完成這個工作,函數簽名是什麼?特別是,你會如何表達你的「比特」? – Arun 2010-03-05 02:04:45

回答

1

這是真的嗎?

char buf[1]; 
buf[0] = char(1); 

如果你想位屏蔽那麼它會是這樣的

enum Enum 
{ 
    MASK_01 = 0x1, 
    MASK_02 = 0x2, 
    MASK_03 = 0x4, 
    MASK_04 = 0x8, 
}; 

char buf[4]; 
buf[0] = Enum::MASK_01; 
buf[1] = Enum::MASK_02; 
buf[2] = Enum::MASK_03; 
buf[3] = Enum::MASK_04; 

如果你提供你所真正想要做的信息,我們也許能夠幫助你。

編輯:謝謝你的額外信息。這是否幫助:

enum Enum 
{ 
    BIT_0000000000000001 = 0x0001, 
    BIT_0000000000000010 = 0x0002, 
    BIT_0000000000000100 = 0x0004, 
    BIT_0000000000001000 = 0x0008, 
    BIT_0000000000010000 = 0x0010, 
    BIT_0000000000100000 = 0x0020, 
    BIT_0000000001000000 = 0x0040, 
    BIT_0000000010000000 = 0x0080, 
    BIT_0000000100000000 = 0x0100, 
    BIT_0000001000000000 = 0x0200, 
    BIT_0000010000000000 = 0x0400, 
    BIT_0000100000000000 = 0x0800, 
    BIT_0001000000000000 = 0x1000, 
    BIT_0010000000000000 = 0x2000, 
    BIT_0100000000000000 = 0x4000, 
    BIT_1000000000000000 = 0x8000, 
}; 


int main(int argc, char* argv[]) 
{ 
    char someArray[8]; 
    memset(someArray, 0, 8); 

    // create an int with the bits you want set 
    int combinedBits = BIT_0000000000000001| 
         BIT_0000000000000010| 
         BIT_1000000000000000; 

    // clear first two bytes 
    memset(someArray, 0, 2); 

    // set the first two bytes in the array 
    *(int*)someArray |= combinedBits; 

    // retrieve the bytes 
    int retrievedBytes = *(int*)someArray; 

    // test if a bit is set 
    if (retrievedBytes & BIT_0000000000000001) 
    { 
     //do something 
    } 
} 

現在枚舉的命名是爲了清楚起見,故意激烈。你也可能會注意到枚舉中只有16位,而不是int中的32位。這是因爲你提到了前兩個字節。使用這種方法,只有數組的前兩個字節將被改變,使用這些枚舉。我不確定這段代碼是否會被惡意搞砸,所以你必須確保你在自己的機器上進行測試。 HTH。

+0

嘿謝謝,但我的問題是完全不同的。我正在設計一個通過UDP的可靠數據傳輸,其中在UDP數據緩衝區中是一個字符數組,並且在我的前兩個字節中,我必須放置像00010000這樣的位....等等,我想知道如何做到這一點。請讓我知道,如果你需要任何信息,提前感謝您的幫助,我真的很感激它。 – Ragy 2010-03-06 03:49:26

0

你用C把位的字符數組或C++中,你將任何東西放入其他任何東西的方式 - 他們都位反正。

由於sizeof(char) == 1根據定義,你只能把每陣列的元件8位。

如果您需要如何玩弄位的幫助,這是一個完全不同的問題,無關與char和數組。

2

也許這更通用的代碼會給你的想法:

void setBitAt(char* buf, int bufByteSize, int bitPosition, bool value) 
{ 
    if(bitPosition < sizeof(char)*8*bufByteSize) 
    { 
     int byteOffset= bitPosition/8; 
     int bitOffset = bitPosition - byteOffset*8; 

     if(value == true) 
     { 
      buf[byteOffset] |= (1 << bitOffset); 
     } 
     else 
     { 
      buf[byteOffset] &= ~(1 << bitOffset);; 
     } 
    } 
} 

//use it as follow: 
char chArray[16]; 
setBitAt(chArray,16*sizeof(char),5,true); //to set bit at pos 5 to 1 
0

C不支持二進制文字,所以你必須代表值爲十六進制。

char *p; 

*p++ = 0x10; 
*p++ = 0xFE; 

看一看功能hton()htonl()用於將多字節值到網絡字節順序。