2016-07-04 108 views
-1

我想std::uint32轉換爲std::vector<std::uint8>在比這更好的方式:C++ 11月14日轉換的std :: UINT32到std :: vector的<std::uint8>

std::uint32_t base_rva = 0xccddee00; 
std::vector<std::uint8_t> vraw_data; 

//copying base_rva to raw_data 
vraw_data.resize(sizeof(base_rva)); 
std::memcpy(vraw_data.data(), &base_rva, sizeof(base_rva)); 

我一直在尋找類似:

std::vector<std::uint8_t> vraw_data((std::uint8_t*)&base_rva, sizeof(base_rva)); 

有什麼建議嗎?

+1

'std :: uint32_t'在哪裏? –

+0

對不起,我要編輯問題 –

+0

_'v_base_rva.resize(v_base_rva.size()+ sizeof(m_base_rva));'_對我來說看起來像完全沒有意義且不必要的代碼,對不起。 –

回答

0

我一直在尋找類似:

std::vector<std::uint8_t> raw_data((std::uint8_t*)&base_rva, sizeof(base_rva)); 

有可供std::vector沒有這樣的構造,但應該要一個std::uint32_t內部表示的副本保存在一個std::vector<std::uint8_t>,你可以簡單地做

std::uint32_t data = 42; 
std::vector<std::uint8_t> raw_data((std::uint8_t*)&data 
            , (std::uint8_t*)&(data) + sizeof(std::uint32_t))); 

根據(4)從std::vector constructors

+0

它的工作原理!謝謝!這個任務完全是關於轉換std :: uint32_t的方式,看起來像是在內存中(liltle endian x86 intel) –

+0

從技術上講,如果'uint8_t'不是[unsigned] char的別名,這將破壞嚴格的別名規則。 –

+0

@Revolver_Ocelot對此非常感興趣,你可以鏈接我的一些信息?不是std :: uint8_t是unsigned char的別名嗎? –

0

如果你不喜歡鑄造,你可以不喜歡它......

union to_byte_vector 
{ 
    uint32_t val; 
    uint8_t bytes[1]; 

    to_byte_vector() = default; 
    to_byte_vector(uint32_t v) : val(v) {} 
    to_byte_vector(const to_byte_vector& o) : val(o.val) {} 
    to_byte_vector& operator=(const to_byte_vector& o) { val = o.val; return *this; } 
    operator uint32_t() const { return val; } 
    std::vector<uint8_t> get_vector() const { return std::vector<uint8_t>(begin(), end()); } 

private: 
    const uint8_t* begin() const { return bytes; } 
    const uint8_t* end() const { return bytes + sizeof(uint32_t); } 
}; 

而且使用它像...

auto vec = to_byte_vector(42).get_vector(); 

不過說真的,這只是讓union爲你做鑄造工作。

相關問題