2016-04-02 3 views
0

Je veux mettre une valeur de 32 bits dans un entier non signé. Je veux que ce programme fonctionne sur des platfroms avec des int de 32 et 64 bits aussi bien qu'avec des petits et grands endians. Voici mon code32 bits dans la conversion unit64 en C++

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

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

Je pense que cela va travailler avec le grand endnian et avec 32 et 64 types entiers de bits, mais je ne suis pas sûr de la façon dont peu endian et memcpy ne se comporte sur différentes plates-formes. N'y a-t-il pas une meilleure solution?

+3

Pourquoi pensez-vous vous avez besoin de réinterpréter cast ici? Pourquoi n'utilisez-vous pas simplement 'uint32_t', dont la taille exacte est garantie? –

+0

J'ai réutilisé de l'ancien code et de l'ID me donner des conseils pour utiliser cette distribution .. et j'ai des fonctions, ça retourne des entiers non signés, mais il semble préférable de les changer ... donc ça marchera sur toutes les plateformes oui? void uCHarToInt (entrée char * non signée, uint32_t * oputput) { \t memcpy (oputput, entrée, 4); } –

+3

Oubliez le code. Décrivez ce que vous voulez réaliser, sans mentionner comment vous tentez de l'atteindre. Parce que, évidemment, le code est bizarre, c'est le moins qu'on puisse dire. – gnasher729

Répondre

2

N'y a-t-il pas une meilleure solution?

Il est en effet.

On ne sait pas de la question de savoir si la séquence d'octets que vous êtes donné est peu endian ou big-endian (je suppose qu'ils sont arrivés dans le cadre d'un protocole de communication?)

Les fonctions suivantes effectuera correctement la conversion, quelle que soit la taille de texte ou endian-ness de l'hôte de réception:

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

} 

résultats attendus:

20003 
20003