3
私は、文字配列を基本型(cast_chunk)とそれ以外の方法(uncast_type)に変換するこれら2つの関数をプロジェクトに持っています。C++ - バイト配列を値に変換するプラットフォーム非依存関数
これらは醜いもので、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);
おかげ
おかげで、どのようにかかわらず、整数とバイト配列との間の変換について? reinterpret_castを使ってuin64_t(uint8_t [8]として)をstd :: vectorに変換することは良い考えではありません。 –
genjix
また、これらの関数と型はブーストには存在しません。 – genjix
あなたはブーストのディストリビューションが分割されているかもしれませんが、あなたは[boost :: endian]を含むピースをインストールする必要があります(もちろん、reinterpret_castを使うのは良い考えではありません。 –