C ++:将unsigned long int转换为vector <uint8_t>原始数据</uint8_t>

时间:2014-08-22 01:43:41

标签: c++ string vector

我需要将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";
    }

3 个答案:

答案 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]);