2016-04-02 2 views
0

Я хочу поместить 32-битное значение в unsigned int. Я хочу, чтобы эта программа запускалась на платформах с 32 и 64 бит int тоже и с маленькими и большими концами. Вот мой код32 бит в преобразование unit64 в C++

void uCHarToInt(unsigned char* input, unsigned int* oputput) 
    { 
     memcpy(oputput, reinterpret_cast<unsigned int*>(&input), 4); 

     if (sizeof(unsigned int) == 8) 
     { 
      *oputput >>= 32; 
     } 
    } 

Я думаю, что это будет работать с большим endnian и с 32 и 64-битных целочисленных типов, но я не уверен, что мало Endian и как тетсру ведут себя на разных платформах. Разве нет лучшего решения?

+3

Почему вы думаете вам нужен реинтерпрет? Почему бы вам просто не использовать 'uint32_t', который, как гарантируется, будет иметь нужный размер? –

+0

Я использовал несколько старых кодов и ID, чтобы посоветовать использовать этот актер. И у меня есть функции, которые возвращают unsigned ints, но, похоже, лучше их изменить ... так что это будет работать на всех платформах да? void uCHarToInt (unsigned char * input, uint32_t * oputput) { \t memcpy (oputput, input, 4); } –

+3

Забудьте о коде. Опишите, чего вы хотите достичь, без каких-либо упоминаний о том, как вы пытаетесь его достичь. Потому что, очевидно, код странный, если не сказать больше. – gnasher729

ответ

2

Нет ли лучшего решения?

Действительно.

Это не ясно из вопроса, является ли прямой порядок байтов или обратный порядок байтов (я предполагаю, что они прибыли в рамках коммуникационного протокола?)

следующие функции последовательность байтов Вам дают будет правильно выполнять преобразование, независимо от размера слова или порядок байтов принимающего хоста:

#include <iostream> 
#include <iomanip> 
#include <iterator> 
#include <algorithm> 

template<class Iter> 
unsigned int accumulate_value(Iter first, Iter last) 
{ 
    unsigned int result = 0; 
    for(; first != last ; ++first) 
    { 
     result <<= 8; 
     result |= *first; 
    } 
    return result; 

} 

unsigned int from_big_endian_stream(const unsigned char* bytes, size_t size = 4) 
{ 
    return accumulate_value(bytes, bytes + size); 
} 

unsigned int from_little_endian_stream(const unsigned char* bytes, 
             size_t size = 4) 
{ 
    return accumulate_value(std::make_reverse_iterator(bytes+4), 
          std::make_reverse_iterator(bytes)); 
} 

int main() 
{ 
    unsigned char little_endian_data[] = { 3, 0, 2, 0 }; 
    unsigned char big_endian_data[] = { 0, 2, 0, 3 }; 

    std::cout << std::hex << from_little_endian_stream(little_endian_data) 
    << std::endl; 

    std::cout << std::hex << from_big_endian_stream(big_endian_data) 
    << std::endl; 

} 

ожидаемые результаты:

20003 
20003 
Смежные вопросы