C# et convertion byte en int
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

C# et convertion byte en int



  1. #1
    aureo91
    Invité

    C# et convertion byte en int


    ------

    Bonjour,

    J'ai un petit problème je vous le présente :

    Dans mon tableau de byte j'ai des valeures qui dépassent 256 donc

    byte[] tab = new byte[40];

    seulement la valeur 1588 est sous cette forme :

    tab[11]=6
    tab[12]=53

    Je veux obtenir un int ou je retrouve mon 1588, donc j'ai essayer int test = BitConverter.ToInt16(tab,12)
    12 car je pars de 0

    et test est different de 1588, aie!

    Avez vous une idée ? Merci

    -----

  2. #2
    Tryph

    Re : C# et convertion byte en int

    Salut,

    quand tu utilises plusieurs octets pour coder un nombre supérieur à 255, c'est comme si tu utilisais un système numérique de base 256.
    tu devrais donc pouvoir convertir tes 2 octets en un entier de cette manière:

    entier = tab[11]*2561 + tab[12]*2560

    le problème c'est que, pour tab[11]=6 et tab[12]=53, cette opération donne 1589 et pas 1588...

    es-tu sûr de tes données?

  3. #3
    aureo91
    Invité

    Re : C# et convertion byte en int

    Excusez moi , c'est une erreur de ma part tab[12]=52

    Merci pour votre aide, pouvez vous m'expliquer un peu pourquoi on passe en 256 , si après 256 on peut passer à 512 etc etc ?

    Je vous remercie beaucoup en tout cas !

  4. #4
    aureo91
    Invité

    Re : C# et convertion byte en int

    En faisant un essai, j'ai un probleme je trouve 13 312, cela n'es il pas du au Big Endien et little Endien sous c# ... Si oui comment contourner ce problème ?

  5. A voir en vidéo sur Futura
  6. #5
    kwariz

    Re : C# et convertion byte en int

    Bonjour,

    comme souvent la doc indique le comportement attendu et les problèmes que l'on peut rencontrer. Sur la page de doc de BitConverter.ToInt16 on trouve par exemple :

    Remarks
    The ToInt16 method converts the bytes from index startIndex to startIndex + 1 to an Int16 value. The order of bytes in the array must reflect the endianness of the computer system's architecture; for more information, see the Remarks section of the BitConverter class topic.
    Déjà il faut commencer au bon endroit, faire un BitConverter.ToInt16(tab,11) plutôt qu'un BitConverter.ToInt16(tab,12) si on veut parser un entier de 16bit sur les éléments 11 et 12.
    Ensuite si tu construis toi même ton tableau il va falloir le construire différément suivant l'endianess de la plateforme d'exécution, pour ça tu as BitConverter.IsLittleEndian par exemple.

  7. #6
    Tryph

    Re : C# et convertion byte en int

    Citation Envoyé par aureo91 Voir le message
    Merci pour votre aide, pouvez vous m'expliquer un peu pourquoi on passe en 256 , si après 256 on peut passer à 512 etc etc ?
    je suis pas certain de bien comprendre la question...

    mais j'ai assimilé les octets à un nombre en base 256 simplement parce qu'un octet ne peut coder que 256 valeurs différentes (soit 28 valeurs car un octet contient 8 bits).
    pour utiliser une base 512, il faudrait un codage de valeur sur 9 bits... c'est pas bien courant.

    pour faire un parallèle avec la base 10, celle qu'on utilise tous les jours et qui n'a que 10 chiffres:
    - avec un seul chiffre on peut compter de 0 à 9, soit 10 valeurs différentes (101).
    - avec 2 chiffres (un pour les dizaines, un pour les unités) on peut compter de 00 à 99, soit 100 valeurs différentes (102).
    - avec 3 chiffres (centaines, dizaines, unités) on peut compter de 000 à 999, soit 1000 valeurs différentes (103).
    - etc...

    on peut généraliser le nombres de valeurs qu'on peut coder avec une base B et un nombre de chiffres N:
    nombre de valeurs codables = BN

    si on en revient à un nombre codé sur plusieurs octets (et en assimilant donc un octet à un chiffre d'une base 256 et en ne s'occupant que des entiers positifs):
    - avec un 1 octet, on peut coder 2561 valeurs différentes. on peut donc compter de 0 à 255
    - avec un 2 octets, on peut coder 2562 valeurs différentes. on peut donc compter de 0 à 65 535
    - avec un 3 octets, on peut coder 2563 valeurs différentes. on peut donc compter de 0 à 16 777 215
    - etc...

    Citation Envoyé par aureo91 Voir le message
    En faisant un essai, j'ai un probleme je trouve 13 312, cela n'es il pas du au Big Endien et little Endien sous c# ... Si oui comment contourner ce problème ?
    13 312 = 52 * 256 soit tab[12]*2561
    à mon avis tu t'es planté quelque part en faisant ton calcul



    EDIT:
    bon bah j'avais pas pris la peine d'aller voir BitConverter.ToInt16, apparemment il suffira de l'utiliser correctement sans se poser de question
    Dernière modification par Tryph ; 29/11/2012 à 14h17.

  8. #7
    aureo91
    Invité

    Re : C# et convertion byte en int

    Sa ne marche pas c'est comme si il prenait pas en compte les valeurs : 52 et 6 mais d'autre valeurs ...

    voici mon code : C#
    byte[] mybuff = new byte[100];
    mybuff[12]=6;
    mybuff[13]=52;
    int testtoint = BitConverter.ToInt16(mybuff, 12);

    testtoint n'est pas égale à 1588.

    mybuff[13]=52 la valeure 52 represente quoi pour c# une valeur octet ou un int ?

    meme si je fais :

    int i = mybuff[12]*256+mybuff[13]*1;

    sa ne marche pas ...
    Dernière modification par aureo91 ; 29/11/2012 à 15h16.

  9. #8
    kwariz

    Re : C# et convertion byte en int

    respire un bon coup

    Le code suivant : (à propos, quand tu postes du code utilise les balise CODE ...)
    Code:
    using System;
    
    namespace conv
    {
      class MainClass
      {
        public static void Main (string[] args)
        {
          byte[] mybuff = new byte[100];
          mybuff [12] = 6;
          mybuff [13] = 52;
          int testtoint = BitConverter.ToInt16 (mybuff, 12);
          Console.WriteLine ("testpoint  = " + testtoint.ToString ());
          Console.WriteLine ("mybuff[12] = " + mybuff [12].ToString ());
          Console.WriteLine ("mybuff[13] = " + mybuff [13].ToString ());
          Console.WriteLine ("6+52*256   = " + (6 + 52 * 256).ToString ());
          Console.WriteLine ("mybuff[12]+256*mybuff[13] = " + (mybuff [12] + 256 * mybuff [13]).ToString ());
          Console.WriteLine ("Is little endian ? " + BitConverter.IsLittleEndian.ToString ());
        }
      }
    }
    Donne le résultat suivant :

    Code:
    testpoint  = 13318
    mybuff[12] = 6
    mybuff[13] = 52
    6+52*256   = 13318
    mybuff[12]+256*mybuff[13] = 13318
    Is little endian ? True
    Tout est normal en little endian ...

    Un byte c'est un entier non signé de 1 octet (8bit) de large.
    Un int c'est un entier signé de 4 octets (32bits) de large.

    Si tu récupères des données en big endian il va d'abord falloir en changer l'endianess avant de les traiter avec des méthodes qui attendent des données en little endian.

  10. #9
    aureo91
    Invité

    Re : C# et convertion byte en int

    Merci pour l'exemple,

    C'est ok, je ne sais pas d'ou venait l'erreur ...

    Merci !

Discussions similaires

  1. Java tcp et tableau de byte
    Par invited08e1382 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 23/12/2011, 19h31
  2. Envoyer Byte port série Visual C++
    Par capit030 dans le forum Électronique
    Réponses: 11
    Dernier message: 05/12/2009, 19h26
  3. addition de byte en java
    Par invitefba82b1f dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 26/07/2007, 13h17
  4. INT management / Telecom INT
    Par invitefaf40fa4 dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 02/02/2005, 17h44