2012-01-15 3 views
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); 

おかげ

答えて

2

ブースト::エンディアンライブラリがconversion functionstypes with specified endiannessの両方を提供します。最もあなたが何をしているかのような

4つの機能は、これらは以下のとおりです。

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); 
+0

おかげで、どのようにかかわらず、整数とバイト配列との間の変換について? reinterpret_castを使ってuin64_t(uint8_t [8]として)をstd :: vector に変換することは良い考えではありません。 – genjix

+0

また、これらの関数と型はブーストには存在しません。 – genjix

+0

あなたはブーストのディストリビューションが分割されているかもしれませんが、あなたは[boost :: endian]を含むピースをインストールする必要があります(もちろん、reinterpret_castを使うのは良い考えではありません。 –

関連する問題