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 512
    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 512
    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