IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Code::Blocks Discussion :

convertir octet en entier


Sujet :

Code::Blocks

  1. #1
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2017
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2017
    Messages : 2
    Par d�faut convertir octet en entier
    Bonjour,
    J'ai un tableau de 360 octets et je voudrai convertir tout les 2 octets successives en un entier et les mettre dans un autre tableau qui sera remplie de 180 entiers.
    Pouvez vous me proposer un algorithme?
    Merci

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par d�faut
    Non c'est l'inverse : tu proposes, nous commentons.

  3. #3
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2017
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2017
    Messages : 2
    Par d�faut convertir octet en entier
    Bonjour,
    En faite j'ai une trame des donn�es qui contient les diff�rents distances en octet. Donc j'ai besoin de convertir ces distances en entier. Les distances sont cod�s sur 2 octets successives.
    Programme:
    char buffer[828];
    int tab1[180],tab2[180],i,j=0;
    for(i=103;i<=461;i=i+2)
    {
    tab1[j]=buffer[i]<<8;
    tab2[j]=buffer[i+1]<<8;
    distance[j]=tab1[j]+tab1[j];

    cout<<"tab1["<<j<<"]="<<tab1[j]<<endl;
    cout<<"tab2["<<j<<"]="<<tab2[j]<<endl;
    cout<<"distance["<<j<<"]="<<distance[j]<<endl;
    j=j+1;
    }

  4. #4
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    Remarques :
    • Pas besoin de cr�er deux �normes tableaux tab1 et tab2. Pour avoir deux variables interm�diaires, il suffit de cr�er deux entiers � l'int�rieur de la boucle for.
    • Dans tab2[j]=buffer[i+1]<<8, il faut enlever <<8.
    • Dans le cas particulier o� int fait deux octets, alors (255 << 8) + 255 est plus grand que la valeur maximale d'un int => signed overflow => comportement ind�termin�. Il vaut mieux utiliser le type unsigned int.
    • char peut �tre sign� ou non sign�. �a d�pend du compilateur et des options du compilateur. Si on veut un type non sign�, on utilise unsigned char.


    Proposition de correction :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <cstddef> // size_t
    #include <climits> // CHAR_BIT // nombre de bits d'un char, donc quasiment toujours 8
     
    static_assert(sizeof(int) >= 2, "int is too small."); // rq : ne peut pas être faux si CHAR_BIT == 8
     
    void copyPairBytes(unsigned int* dest, const unsigned char* src, size_t count)
    {
        for(size_t k = 0; k < count; ++k) {
            const unsigned int val1 = src[2*k];
            const unsigned int val2 = src[2*k+1];
            dest[k] = (val1 << CHAR_BIT) + val2;
        }
    }
    Si on suppose que distance est un tableau de unsigned int, tu peux alors appeler la fonction ainsi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    copyPairBytes(distance, reinterpret_cast<unsigned char*>(buffer)+103, 180);
    Si tu peux changer le type de buffer en tableau de unsigned char, tu n'auras plus besoin de reinterpret_cast.

  5. #5
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par d�faut
    Bon l� tu d�cales les deux octets, il faut choisir. D'autre part si les endianness-es du buffer et de la machine cible sont identiques, l'op�ration se r�sume � un simple memcpy :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <cstdint> // fixed-width types
    #include <cstring> // memcpy
    #include <iostream>
     
    #define SRC_ENDIANNESS (__BIG_ENDIAN)
    #define DST_ENDIANNESS (__BYTE_ORDER)
     
    static void concat(uint16_t *dst, const uint8_t *src, std::size_t count) {
    #if SRC_ENDIANNESS == DST_ENDIANNESS
        std::memcpy(dst, src, count * 2);
    #else
        for(std::size_t i{0}; i <= count; ++i) {
            const auto i2 = i * 2;
            dst[i] = (uint16_t(src[i2]) << 8) | (uint16_t(src[i2 + 1]) << 0);
        }
    #endif
    }
     
    int main() {
        const uint8_t src[] = {
            0xde, 0xad,
            0xbe, 0xef
        };
        uint16_t dst[2];
     
        concat(dst, src, 2);
     
        std::cout << std::hex
                  << "{ 0x" << dst[0] << ", 0x"  << dst[1] << " }"
                  << std::endl;
     
        return 0;
    }

    Tu parles de trame : en r�gle g�n�rale on utilise htons et consorts pour ce genre de t�che.

Discussions similaires

  1. Convertir s�quence ADN => entier unique ?
    Par ctobini dans le forum Bioinformatique
    R�ponses: 2
    Dernier message: 04/10/2007, 10h20
  2. Conversion d'un tableau d'octets en entier
    Par noutnout53 dans le forum Collection et Stream
    R�ponses: 5
    Dernier message: 25/09/2006, 11h54
  3. convertir r�el _ entier
    Par iamhere dans le forum C++
    R�ponses: 6
    Dernier message: 02/04/2006, 16h54
  4. Convertir D�cimal en entier ?
    Par _developpeur_ dans le forum Access
    R�ponses: 12
    Dernier message: 11/01/2006, 15h41
  5. convertir tableau d'entier en char[]
    Par nin47 dans le forum C
    R�ponses: 20
    Dernier message: 12/10/2005, 20h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo