我的项目中有两个函数可以将字符数组转换为基本类型(cast_chunk),反之亦然(uncast_type)。
它们很丑陋并且依赖于C ++编译器中的基本假设。在std或boost中有什么东西我可以替换它们吗?
typedef uint8_t byte;
typedef std::vector<byte> data_chunk;
template<typename T>
T cast_chunk(data_chunk chunk, bool reverse=false)
{
#ifdef BOOST_LITTLE_ENDIAN
// do nothing
#elif BOOST_BIG_ENDIAN
reverse = !reverse;
#else
#error "Endian isn't defined!"
#endif
if (reverse)
std::reverse(begin(chunk), end(chunk));
T val = 0;
for (size_t i = 0; i < sizeof(T) && i < chunk.size(); ++i)
val += static_cast<T>(chunk[i]) << (i*8);
return val;
}
template<typename T>
data_chunk uncast_type(T val, bool reverse=false)
{
#ifdef BOOST_LITTLE_ENDIAN
// do nothing
#elif BOOST_BIG_ENDIAN
reverse = !reverse;
#else
#error "Endian isn't defined!"
#endif
data_chunk chunk;
for (size_t i = 0; i < sizeof(T); ++i)
chunk.push_back(reinterpret_cast<byte*>(&val)[i]);
if (reverse)
std::reverse(begin(chunk), end(chunk));
return chunk;
}
这是他们通常使用的方式:
uint64_t val = 110;
data_chunk byte_array = uncast_type(val);
assert(val == cast_chunk<uint64_t>(byte_array);
由于
答案 0 :(得分:2)
boost :: endian库同时提供conversion functions和types with specified endianness。
与您正在做的最相似的四个功能是:
template <class T> void native_to_big(T& x);
template <class T> void native_to_little(T& x);
template <class T> void big_to_native(T& x);
template <class T> void little_to_native(T& x);
template <class T> void native_to_big(T source, T& target);
template <class T> void native_to_little(T source, T& target);
template <class T> void big_to_native(T source, T& target);
template <class T> void little_to_native(T source, T& target);