2016-04-02 16 views
0

İmzasız int'ye 32 bitlik bir değer koymak istiyorum. Bu programın 32 ve 64 bit int ile platfromlarda ve hem küçük hem de büyük endianlarla çalışmasını istiyorum. İşte bu büyük endnian ile ve 32 ve 64 bit tamsayı türleri ile çalışmak için gidiyor düşünüyorum kodum32 bit, birim dönüştürülecek C++ içinde

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

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

, ama küçük endian hakkında emin değilim ve nasıl memcpy farklı platformlarda davranırlar yok. Daha iyi bir çözüm yok mu? daha iyi bir çözüm

+3

sizce neden kelime boyutu veya alıcı konağın endian-lik olursa olsun, doğru dönüşüm gerçekleştirecek Burada yeniden yorumlama yapman gerekiyor mu? Neden tam olarak istediğiniz boyuta sahip olacak şekilde 'uint32_t' kullanmıyorsunuz? –

+0

Bazı eski kodları yeniden kullandım ve ID bu yazıyı kullanmam için bana tavsiyede bulunsun .. ve imzasız inters döndüren işlevlerim var, ama onları değiştirmek daha iyi görünüyor ... bu yüzden tüm platformlarda çalışacak mıyım? void uCHarToInt (işaretsiz char * girişi, uint32_t * oputput) { \t memcpy (oputput, giriş, 4); } –

+3

Kodu unutun. Neyi başarmak istediğinizi belirtmeden, neyi başarmak istediğinizi tanımlayın. Çünkü açıkça, kod en az söylemek garip. – gnasher729

cevap

2

yok mu?

gerçekten yoktur.

Size veriliyor bayt dizisi küçük endian veya big-endian (onlar bir iletişim protokolünün bir parçası olarak gelmiş olduğunu varsayarak ben?)

aşağıdaki işlevleri olup olmadığı sorusuna gelen net değil

#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; 

} 

beklenen sonuçlar:

20003 
20003 
İlgili konular