C++ 中 32 位到 unit64 的转换

32 bits into unit64 conversion in C++

我想将一个 32 位值放入 unsigned int 中。我希望这个程序 运行 在具有 32 位和 64 位 int 以及小端和大端的平台上。这是我的代码

  void uCHarToInt(unsigned char* input, unsigned int* oputput)
  {
       memcpy(oputput, reinterpret_cast<unsigned int*>(&input), 4);

      if (sizeof(unsigned int) == 8) 
      {
           *oputput >>= 32;
      }
  }

我认为这将适用于 big endnian 以及 32 位和 64 位整数类型,但我不确定 little endian 以及 memcpy 在不同平台上的表现如何。有没有更好的解决办法?

Isn't there a better solution?

确实有。

从问题中不清楚您得到的字节序列是小端还是大端(我假设它们是作为通信协议的一部分到达的?)

无论接收主机的字长或字节顺序如何,以下函数都将正确执行转换:

#include <iostream>
#include <iomanip>
#include <iterator>
#include <algorithm>

template<class Iter>
unsigned int accumulate_value(Iter first, Iter last)
{
    unsigned int result = 0;
    for( ; first != last ; ++first)
    {
        result <<= 8;
        result |= *first;
    }
    return result;

}

unsigned int from_big_endian_stream(const unsigned char* bytes, size_t size = 4)
{
    return accumulate_value(bytes, bytes + size);
}

unsigned int from_little_endian_stream(const unsigned char* bytes,
                                       size_t size = 4)
{
    return accumulate_value(std::make_reverse_iterator(bytes+4),
                            std::make_reverse_iterator(bytes));
}

int main()
{
    unsigned char little_endian_data[] = { 3, 0, 2, 0 };
    unsigned char big_endian_data[] = { 0, 2, 0, 3 };

    std::cout << std::hex << from_little_endian_stream(little_endian_data)
    << std::endl;

    std::cout << std::hex << from_big_endian_stream(big_endian_data)
    << std::endl;

}

预期结果:

20003
20003