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
我想将一个 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