2017-01-05 10 views
2

私は符号なしlong longを持っており、それをより小さなバイトに分割したい。例: C++ QWORDをより小さな変数に分割する

unsigned long long TEST = 0x465958432E1F0199; 

次のように文字に分割します。 char TEST2 equal to 0x46, TEST3 equal to 0x59, TEST4 equal to 0x58など。どうすればこのことができますか?

+0

は '* uint_8'にそのメモリアドレスをキャスト? –

+1

マスクとシフトについて質問していますか?例えば ​​'(TEST >> 4)& 0xFF;'は '0x19'を返します。つまり、あなたの 'TEST2'は'(TEST >> 56)& 0xFF; 'でしょう。 – freakish

答えて

1

ポインタを使用すると、そのトリックが実行されます。バイト単位でvar

template <typename T> 
std::vector<uint8_t> iterateOverBytes(const T& var) { 
    std::vector<uint8_t> toReturn; 

    for(auto i = 0u; i < sizeof(var); ++i) { 
     toReturn.push_back(reinterpret_cast<const uint8_t*>(&var)[i]); 
    } 

    return toReturn; 
} 

sizeof(var)返すサイズは、サイズsizeof(var)でバイトの配列のようにvarへのポインタを使用することができます。全くキャストを必要としない溶液について

for(const auto& byte: iterateOverBytes(TEST)) { 
    std::cout << std::hex << int(byte) << std::endl; 
} 
0

方法:

今、単純なループ印刷番号は、コードを完了しますか? (;システムは、整数値を構成するコンポーネントのバイトを注文するさまざまな方法を持つことができるので、リキャストポインタを使用して整数値の各バイトを読む

unsigned long long TEST = 0x465958432E1F0199; 
uint8_t elements[sizeof(TEST)]; 
memcpy(elements, &test, sizeof(elements)); 
0

は、ポータブルではありませんビッグエンディアンのシステムが最もsiginificantバイトを配置します。リトルエンディアンシステムは最下位バイトから開始します。

これを移植可能に処理するには、ビットシフト演算子を使用して、派生整数値の最下位位置に目的のバイトを配置してからキャストします結果はバイトサイズの整数型(uint8_tなど)になります。

#include <iostream> 
#include <iomanip> 
#include <vector> 
#include <cstdint> 

int main() { 
    const unsigned long long word = 0x465958432E1F0199ull; 
    // scan through all bytes, adding each one to a vector 
    // most significant byte first 
    std::vector<std::uint8_t> bytes; 
    for(auto i=sizeof(word)-1; i+1; --i) { 
     const auto b = static_cast<std::uint8_t>(word >> i*8); 
     bytes.push_back(b); 
    } 
    // Dump vector of bytes as 2-digit hex values 
    std::cout << std::hex << std::setfill('0'); 
    for(auto b : bytes) { 
     std::cout << std::setw(2) << static_cast<unsigned>(b) << ' '; 
    } 
    std::cout << '\n'; 
} 

出力

46 59 58 43 2e 1f 01 99

関連する問題