私は符号なしlong longを持っており、それをより小さなバイトに分割したい。例: C++ QWORDをより小さな変数に分割する
unsigned long long TEST = 0x465958432E1F0199;
次のように文字に分割します。 char TEST2 equal to 0x46, TEST3 equal to 0x59, TEST4 equal to 0x58
など。どうすればこのことができますか?
私は符号なしlong longを持っており、それをより小さなバイトに分割したい。例: C++ QWORDをより小さな変数に分割する
unsigned long long TEST = 0x465958432E1F0199;
次のように文字に分割します。 char TEST2 equal to 0x46, TEST3 equal to 0x59, TEST4 equal to 0x58
など。どうすればこのことができますか?
ポインタを使用すると、そのトリックが実行されます。バイト単位で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;
}
方法:
今、単純なループ印刷番号は、コードを完了しますか? (;システムは、整数値を構成するコンポーネントのバイトを注文するさまざまな方法を持つことができるので、リキャストポインタを使用して整数値の各バイトを読む
unsigned long long TEST = 0x465958432E1F0199;
uint8_t elements[sizeof(TEST)];
memcpy(elements, &test, sizeof(elements));
は、ポータブルではありませんビッグエンディアンのシステムが最も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
は '* uint_8'にそのメモリアドレスをキャスト? –
マスクとシフトについて質問していますか?例えば '(TEST >> 4)& 0xFF;'は '0x19'を返します。つまり、あなたの 'TEST2'は'(TEST >> 56)& 0xFF; 'でしょう。 – freakish