C++ c++;将QWORD十六进制拆分为更小的变量
我有一个无符号的long long,我想把它分成更小的字节。 e、 g 我想把它分成以下几个字符。C++ c++;将QWORD十六进制拆分为更小的变量,c++,C++,我有一个无符号的long long,我想把它分成更小的字节。 e、 g 我想把它分成以下几个字符。 字符TEST2等于0x46,TEST3等于0x59,TEST4等于0x58,依此类推。我该怎么做呢?使用指针就可以了 template <typename T> std::vector<uint8_t> iterateOverBytes(const T& var) { std::vector<uint8_t> toReturn; for
字符TEST2等于0x46,TEST3等于0x59,TEST4等于0x58,依此类推。我该怎么做呢?使用指针就可以了
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;
}
一个完全不需要强制转换的解决方案怎么样?(
使用重铸指针读取整数值的每个字节是不可移植的,因为系统可以采用不同的方式对组成整数值的组件字节进行排序。大端系统将最重要的字节放在内存的第一位,而小端系统则以最低阶字节开始
要方便地处理此问题,请使用位移位运算符将所需字节置于派生整数值的最低顺序位置,然后将结果转换为字节大小的整数类型(如uint8\t
)
#包括
#包括
#包括
#包括
int main(){
常量无符号长字=0x465958432E1F0199ull;
//扫描所有字节,将每个字节添加到一个向量
//最高有效字节优先
std::向量字节;
对于(自动i=sizeof(word)-1;i+1;--i){
const auto b=静态_cast(word>>i*8);
字节。推回(b);
}
//将字节向量转储为2位十六进制值
std::cout将其内存地址强制转换为uint_8*
?您是否询问掩码和移位?例如(测试>>4)&0xFF;
将为您提供0x19
。因此您的TEST2
将是(测试>>56)&0xFF;
。
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;
}
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));
#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';
}