在C ++中将32位转换为unit64转换

时间:2016-04-02 11:26:23

标签: c++ memcpy

我想将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位整数类型,但我不确定小端,以及memcpy在不同平台上的行为方式。是不是有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

  

难道没有更好的解决方案吗?

确实有。

从问题中,您所提供的字节序列是小端还是大端(我假设它们是作为通信协议的一部分到达了?)

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

#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