C ++ - Платформо-независимая функция для байтового массива в значение и наоборот - PullRequest
3 голосов
/ 15 января 2012

В моем проекте есть две эти функции для преобразования массива символов в базовый тип (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);

Спасибо

1 Ответ

2 голосов
/ 15 января 2012

Библиотека boost :: endian предоставляет функции преобразования * типов 1002 * и с указанным порядком байтов .

Вот четыре функции, которые вам наиболее нравятся:1007 *

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...