gpt4 book ai didi

C++ - 字节数组到值的平台独立函数,反之亦然

转载 作者:太空狗 更新时间:2023-10-29 21:49:11 25 4
gpt4 key购买 nike

我的项目中有这两个函数,用于将字符数组转换为基本类型 (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);

谢谢

最佳答案

boost::endian 库同时提供 conversion functionstypes 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);

关于C++ - 字节数组到值的平台独立函数,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com