2016-12-26 81 views
3

在下面的代碼我從一些二進制文件填補了uint8_t載體,它包含some_size數個字節的信息 -轉換載體的BitSet

​​

現在我從一些指標知道說20,有存在37字節的10,我需要填入bitset。該位看起來像std::bitset<37> booleans;,並初始化爲全部0。現在,如果初始索引是20,所以我需要填寫booleans 37個存在於這將範圍從buffer[20]buffer[56]字節布爾值。

除了遍歷載體和手動位集上的每個比特設置爲1或0,是否有任何其他的方法來那些字節轉換到這個位集合?

+2

我不知道你將如何uint8_t'轉換'無需編寫循環或使用功能不內部循環的爲你bitset'使用類型'。無論哪種方式,循環完成。 – PaulMcKenzie

+0

@PaulMcKenzie ofcourse一個循環是必需的。但是使用'std :: copy'或'std :: copy_n'這樣的手動循環就是我在這裏要求的。 –

+0

問題在於'bitset'沒有迭代器,因此''copy''或'copy_n'等算法函數將難以按照自己的想法操作。 'for_each'可能是你可以做的最好的,[像這樣的東西](http://ideone.com/KyPbvU)。 – PaulMcKenzie

回答

3

既然你不想寫一個手工編碼的循環,你可以使用std::for_each

#include <bitset> 
#include <cstdint> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::vector <uint8_t> buffer(100, 0); 
    std::bitset<37> b; 
    std::size_t i = 0; 
    std::for_each(buffer.begin() + 20, buffer.begin() + 57, [&](uint8_t val) 
    { b[i] = val; ++i; }); 
} 

根本的問題是,std::bitset沒有迭代器,所以如果要使用的熟悉STL算法的功能,如std::copystd::copy_nstd::transform等需要迭代器是困難的,如果不是不可能的是算法函數中的源(或目標)。因此,似乎std::for_each與增加索引的lambda將起作用。

+0

已編輯。此外[本站點](http://en.cppreference.com/w/cpp/utility/bitset)是一個更好的C++文檔站點。 – PaulMcKenzie

+0

你可以把'i'放在捕獲列表中,並使lambda可變,而不是聲明它在它的作用域之外,就像這樣:'[&,i = std :: size_t {0}](uint8_t val)mutable .. .'。這有點冗長,但意圖變得更清晰。 –

1

你可以做這樣的事情:

std::vector<uint8_t> sourceVec{1,0,1,1,0}; 
std::stringstream strStream; 
std::copy(sourceVec.begin(), sourceVec.end(), std::ostream_iterator<int>(strStream)); 
std::bitset<5> bitsetVar(strStream.str()); 
+0

僅作示例。 –