我想将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在不同平台上的行为方式。是不是有更好的解决方案?
答案 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