2

我无法弄清楚如何将十六进制值向量转换为十进制长整数。

    vector<uint8_t>v;

    v.push_back(0x02);
    v.push_back(0x08);
    v.push_back(0x00);
    v.push_back(0x04);
    v.push_back(0x60);
    v.push_back(0x50);
    v.push_back(0x58);
    v.push_back(0x4E);
    v.push_back(0x01);
    v.push_back(0x80);

//How would I achieve this:
    long time =  0x00046050584E0180; //1,231,798,102,000,000

我如何将向量 v 的元素 2-9 变成一个 long int,就像上面用长“时间”表示的那样。

谢谢!

4

5 回答 5

4

这里的基本原则是:

int x = 0; 
for(uint8_t i : v)
{
   x <<= 8; 
   x |= i;
}
于 2013-07-23T14:44:01.657 回答
1

未测试:

int time = 0;
for (int i:v) time = time << 8 + i;
于 2013-07-23T14:43:14.410 回答
1

您当然可以使用适当定义的函数在算法上执行此操作:

long long f( long long acc, unsigned char val )
{
   return ( acc << 8 ) + val;
}

该值通过以下方式计算:

#include <numeric>

long long result = std::accumulate( v.begin() + 2, v.end(), 0ll, f );
于 2013-07-23T15:40:58.367 回答
1

由于std::vector将其数据包含在内存向量中,因此您可以使用指针转换,例如:

vector<uint8_t> v;
assert(v.size() >= 2 + sizeof(long)/sizeof(uint8_t));
long time = *reinterpret_cast<const long*>(&v[2]);

确保向量包含足够的数据,并注意不同的字节序类型。

于 2013-07-23T14:57:34.937 回答
0

我的解决方案如下,我已经测试过了。你可以试一试。

long long res = 0;
for (int i = 2; i < 10; ++i)
    res = (res << 8) + v[i];
于 2013-07-23T14:53:57.847 回答