2011-11-28 217 views
5

我需要從位集中提取字節,而不是包含多個CHAR_BIT位。我現在需要將bitset中的多少位放入數組中。例如,如何將bitset轉換爲bytes/uint8數組?

的位置被聲明爲std::bitset < 40> id;

有一個單獨的可變nBits多少比特在id是可用的。現在我想要以CHAR_BIT的倍數提取這些位。我還需要處理nBits % CHAR_BIT != 0的情況。我可以把它放入一個uint8數組中

+2

苛刻...如果你的sizeof(unsigned long)比特小於sizeof,這可以直接使用'bitset :: to_ulong'。事實上,我不認爲有一個簡單的解決方案。 'std :: bitset'沒有像'std :: vector'那樣的'data()'(儘管gcc版本有一個沒有記錄的實驗'_M_getdata'函數就是這個......)'。由於沒有其他的東西,你只能單獨訪問各個位。或者,序列化爲一個字符串或通過一個流,但這些都不是特別有效。 – Damon

回答

3

不幸的是,如果你需要比unsigned long中的位數(在這種情況下你可以使用to_ulong),語言中沒有好的方法。你必須遍歷所有的位並自己生成字節數組。

15

您可以使用boost::dynamic_bitset,可以使用boost::to_block_range將其轉換爲「塊」的範圍。

#include <cstdlib> 
#include <cstdint> 
#include <iterator> 
#include <vector> 
#include <boost/dynamic_bitset.hpp> 

int main() 
{ 
    typedef uint8_t Block; // Make the block size one byte 
    typedef boost::dynamic_bitset<Block> Bitset; 

    Bitset bitset(40); // 40 bits 

    // Assign random bits 
    for (int i=0; i<40; ++i) 
    { 
     bitset[i] = std::rand() % 2; 
    } 

    // Copy bytes to buffer 
    std::vector<Block> bytes; 
    boost::to_block_range(bitset, std::back_inserter(bytes)); 
} 
+0

需要注意的一個問題是,矢量的內部類型需要匹配用於構造位集的塊類型(在本例中爲'unsigned char')。如果該位具有4字節塊,但該向量具有1字節塊,則「to_block」將無聲地切斷每個塊的後3個字節。 因此,在Emile對'std :: vector bytes'的回答中更改向量聲明有點安全。 – prideout

+0

糾正我的評論:內部類型是'Bitset :: block_type',而不是'Bitset :: Block'。 – prideout

+0

@prideout:增加了'Block' typedef以避免你描述的情況。 –