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

C++ Discussion :

Utilisation du type BYTE


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Utilisation du type BYTE
    Bonjour à tous
    je dispose d'une signature de fonction de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int lire(int var1,int var2, BYTE* var3)
    cette fonction permet de lire des données en bloc sur du matériel (pas important).
    j'arrive à lire ces données une par une mais je voudrai le faire par bloc.
    supposant qu'il y 15 données (15 int ou 15 double ou 15 booleen) à lire.
    sachant que BYTE est un unsigned char, comment faire pour récupérer ces 15 données et les afficher. le code suivant est-il correct ( je ne peux pas le tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char buffer[150];
    lire(1,1, buffer);
    for( int i  = 0; i< 10; i++)
    {
           cout << " data " << i << " = " << buffer[i] <<endl;
    }
    1. comment connaitre le nombre de données récupérées pour éviter que buffer[i] pointe sur autre chose que les données lues.

    1. le même problème se pose pour l'écriture d'un bloc avec la fonction
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ecrire (int,int, BYTE* buffer)

    1. que contient vraiment buffer? est-il un tableau d'entiers? la question est surement bête mais vous la pour me le prouver

    je rappelle que cette question est générique et indépendante d'où je récupère les données. les fonctions Lecture et écriture sont dans une Dll sans aucune autre information que la signature.

    merci d'avance à tous pour votre aide

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par AutrementDit Voir le message
    le code suivant est-il correct ( je ne peux pas le tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char buffer[150];
    lire(1,1, buffer);
    for( int i  = 0; i< 10; i++)
    {
           cout << " data " << i << " = " << buffer[i] <<endl;
    }
    Il est correct dans le sens où il compilera et ne plantera pas. Maintenant, ça m'étonnerai qu'il affiche ce que tu souhaites réellement afficher. Ce qu'il va afficher, c'est la représentation ascii de la valeur de ton unsigned char. Je suppose que ce que tu souhaites afficher, c'est sa valeur, et non sa représentation ascii. Si c'est bien le cas, il faudra faire quelque chose dans le style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << " data " << i << " = " << std::hex << (int) buffer[i] << std::dec;
    Citation Envoyé par AutrementDit Voir le message
    comment connaitre le nombre de données récupérées pour éviter que buffer[i] pointe sur autre chose que les données lues.
    3 solutions:
    -> la fonction lire() renvoie le nombre réel d'octets lus.
    -> la fonction lire() rempli un vector<unsigned char> (ou vector<BYTE>, c'est pareil), plutôt qu'un unsigned char[] (res. BYTE[] )
    -> utiliser un byte de "fin de trame": une valeur réservée qui indique qu'il n'y a plus de données pertinentes après.

    Citation Envoyé par AutrementDit Voir le message
    le même problème se pose pour l'écriture d'un bloc avec la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecrire (int,int, BYTE* buffer)
    Même problème, mêmes solutions

    Citation Envoyé par AutrementDit Voir le message
    que contient vraiment buffer? est-il un tableau d'entiers?
    Ca dépend du niveau auquel tu te place. Si tu te place au niveau matériel, ce ne sont que des 0 et des 1, des bits quoi. Si tu monte d'un niveau, c'est à dire, à quoi correspondent ces 0 et ces 1, là ça dépend de ce que tu lis. C'est à dire qu'il faut interpréter ces 0 et 1 (un BYTE ou unsigned char c'est un octet, donc 8 bits), et la façon d'interpréter ces données dépend du protocole (règles de communications entre celui qui envoie et celui qui reçois les données). Par exemple, si tu lis des int sur 32 bits, alors il te faudra "assembler" tes BYTES par groupe de 4 et interpréter ces "paquets" de façon adéquate.

    Hope it helps.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Utilisation du type BYTE
    Pour commencer, merci pour ta réponse.
    En effet, je saisi une notion qui m'échape complétement. En fait je me demandais comment peut-on mettre un entier dans un char, sachant qu'un entier peut être sur 16 bits alors que le char est sur 8 bits. donc si j'ai bien compris:
    si la donnée est un entier de 16 bits ( exemple : int 300 = 12C (hexa) = 0000000100101100 (binaire) on aura dans le buffer[i] =00000001 et buffer[i+1] = 00101100 ( en faisant abstration de little /big endian).

    00101100 = 44 en decimal = "," ( ASCII) donc buffer[i+1] contiendra la virgule.
    est ce bien ca?

    merci d'avance

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par AutrementDit Voir le message
    Pour commencer, merci pour ta réponse.
    En effet, je saisi une notion qui m'échape complétement. En fait je me demandais comment peut-on mettre un entier dans un char, sachant qu'un entier peut être sur 16 bits alors que le char est sur 8 bits. donc si j'ai bien compris:
    si la donnée est un entier de 16 bits ( exemple : int 300 = 12C (hexa) = 0000000100101100 (binaire) on aura dans le buffer[i] =00000001 et buffer[i+1] = 00101100 ( en faisant abstration de little /big endian).

    00101100 = 44 en decimal = "," ( ASCII) donc buffer[i+1] contiendra la virgule.
    est ce bien ca?

    merci d'avance
    Tu peux mettre un entier dans un char dès lors qu'il est compris entre 0 et 255 pour un unsigned char et -128 à 127 pour un char. Les entiers sont codés sur 32 bits sur les x86, les short int sur 16 bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <iostream>
    #include <bitset>
     
    int main( void )
    {
      int number = 4590903;
      size_t size = sizeof( number );
      unsigned char * data;
      data = reinterpret_cast<unsigned char*>( &number );
      for( int i=0; static_cast<size_t>(i) < size; i++ )
        std::cout << std::bitset<8>( data[i] ) << std::endl;
      return 0;
    }
    Ce programme affiche comment est représenté en mémoire l'entier number.
    Sur une machine little endian, tu obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    00110111
    00001101
    01000110
    00000000
    L'octet de poids le plus faible en premier
    Tu peux modifier facilement ce bout de code pour voir comment s'organise la mémoire avec d'autres types.

    Tu peux également utiliser la bibliothèque boost comme ceci:
    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
     
    #include <iostream>
    #include <boost/dynamic_bitset.hpp>
    typedef unsigned char octet;
     
    int main( void )
    {
      int number = 4590903;
      size_t size = sizeof( number );
      octet * data;
      data = reinterpret_cast<octet*>( &number );
      boost::dynamic_bitset<octet> mask( data, data+size );
      std::cout <<mask << std::endl;
      return 0;
    }
    Tu obtiens en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    00000000010001100000110100110111
    Cette fois-ci tu obtiens l'affichage en big endian.
    Tu peux mettre aussi un float par exemple et regarde la page wikipédia sur l'IEEE 754, il y a d'ailleurs un exemple de codage d'un float.

Discussions similaires

  1. [D2005] Utilisation des types énumérés
    Par bouha dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 21/07/2005, 22h21
  2. Erreur utilisation de type indéfini
    Par hanane_iaai dans le forum C++
    Réponses: 3
    Dernier message: 04/07/2005, 17h34
  3. [HTML]Utilisation du type file
    Par Kuroro dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 23/12/2004, 16h12
  4. Type byte ou equivalent
    Par barucca dans le forum C
    Réponses: 9
    Dernier message: 24/06/2004, 15h05
  5. utilisation du type DATE d'interbase
    Par dibak dans le forum InterBase
    Réponses: 4
    Dernier message: 05/01/2004, 15h03

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