我需要将long int x = 0x9c758d0f
转换为vector<uint8_t> y = 9c 75 8d 0f
。
我正在使用:
std::stringsteam ss;
ss << std::hex << x;
std::string s = ss.str();
std::vector<uint8_t> y;
String2Vector(s,y);
void String2Vector(std::string& in, std::vector<uint8_t>& output)
{
std::vector<uint8_t> out;
size_t len = in.length();
for(size_t i = 0; i < len; i += 1)
{
std::stringstream strm(in.substr(i, 1));
uint8_t x;
strm >>std::hex>> x;
out.push_back(x);
}
output = out;
}
但是,vector<uint8_t>
存储了ASCII数而不是十六进制值。
如何将long int
转换为原始数据向量,我该怎么做?
这是一个多平台项目,所以我不想触摸memcpy()
等。
更新:非常确定出现了问题:
long int x = 0x9c758d0f;
std::vector<uint8_t> v;
v.reserve(sizeof(x));
for (size_t i = 0; i < sizeof(x); ++i) {
v.push_back(x & 0xFF);
x = (x>>8);
}
PrintOutVector(v);
void PrintOutVector(std::vector<uint8_t>& in)
{
std::cout << "Vector Contains: ";
for(std::vector<uint8_t>::iterator i=in.begin(); i != in.end(); ++i)
std::cout << std::hex << *i ;
std::cout << "\n";
}
输出为▒C▒▒h4
解决方案:非常感谢@WhozCraig @Anton Savin
long int x = 0x9c758d0f;
std::vector<uint8_t> v;
v.reserve(sizeof(x));
for (size_t i = 0; i < sizeof(x); ++i) {
v.push_back(x & 0xFF);
x = (x>>8);
}
PrintOutVector(v);
void PrintOutVector(std::vector<uint8_t>& in)
{
std::cout << "Vector Contains: ";
for(std::vector<uint8_t>::iterator i=in.begin(); i != in.end(); ++i)
std::cout << std::hex << static_cast<unsigned int>(*i)
std::cout << "\n";
}
答案 0 :(得分:2)
long int x = 0x9c758d0f;
const uint8_t* begin = reinterpret_cast<const uint8_t*>(&x);
const uint8_t* end = begin + sizeof(x);
std::vector<uint8_t> v(begin, end);
请注意,排序取决于系统如何排列long
中的字节(大端或小端)。您可以通过首先使用类似htonl()的函数将字节重新排序为big-endian来处理此问题,但int
除外,long
没有跨平台的字节,因此您可以使用#{1}}。如果你关心字节排序,我必须考虑做什么。
答案 1 :(得分:1)
这是一种无论字节顺序如何都能提供相同结果的解决方案:
long int x = 0x9c758d0f;
std::vector<uint8_t> v;
v.reserve(sizeof(x));
for (size_t i = 0; i < sizeof(x); ++i) {
v.push_back(x & 0xFF);
x >>= 8;
}
答案 2 :(得分:0)
工会为这类东西派上用场。唯一的问题是字节顺序可能因字节顺序而异,您必须考虑这一点。
union U{
long int i;
uint8_t uc[4];
};
U u = {0x9c758d0f};
std::vector<uint8_t> ucvec(u.uc, u.uc+4);
printf ("%x:%x:%x:%x\n", ucvec[3], ucvec[2], ucvec[1], ucvec[0]);