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

Collection et Stream Java Discussion :

Caster Tableau de Byte en tableau de Short


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut Caster Tableau de Byte en tableau de Short
    Bonjour,
    N'ayant pas trouvé l'information ni dans la faq ni dans le forum (mais j'ai un doute sur mes recherches...), je me permets de poser la question:

    J'ai en entré un tableau de byte[] "input" contenant 40 éléments. En fait, même si il est défini en tant que tableau de bytes, c'est un tableau de short qui est reçu (donc de 20 éléments)

    je souhaiterai donc caster mon buffer, pour qu'il soit reconnu en tant que short.
    L'équivalent C serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void fonction( byte * input)
    {
        short * tabShort = (short*)input;
     
       ...
    }
    Mais je ne trouve pas la syntaxe. Du coup j'en suis à me demander si cela est possible.

    Pour info, je n'ai pas le choix sur le format du buffer d'entrée. C'est un buffer récupéré par une fonction de l'API Java Card, qui retourne forcement un tableau de byte.

    Merci de votre aide.

    Antoine

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            short s = (short) (input[0] << 8) ;
            s = (short) (s + input[1]);
    explication tu décale les 8 bits dans l'octet de poids fort et apres tu ajoute les 8 bits de poids faible.

    variante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            short s = (short) (input[0] << 8);
            s = (short) (s | input[1]);
    personnellement j'aime mieux la 2eme

  3. #3
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    peut être même ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ( int index_b = 0, index_s = 0; index_b < limite; index_b += 2, index_s++ )
      tableau_s[index_s] = (short)( input[index_b] | input[index_b + 1]);
    Mais tout ça c'est de la bidouille... faut qu'on apprenne à "penser" POO. Sauf que je ne suis pas fortiche dans ce domaine
    @ bientôt...

    Salut & @+ sur 3W!

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    On ne peut pas "caster" l'un vers l'autre.
    Il n'y a pas d'emplacement mémoire en POO. Il y a des objets.
    La conversion entre byte[] et short[] n'allant pas de soi, il n'y a pas d'opérateur de cast pour. (D'ailleurs c'est ambigu : little endian ou big endian ?)

    Idéalement, et comme le dit rtg57, il ne faut même pas songer à faire ça. Il faut avoir pensé son programme de sorte qu'on en arrive pas là. Puisqu'on veut un short[], il n'y a aucune raison qu'un byte[] intervienne quelque part dans cette histoire.

    Mais bon, on fait pas toujours ce qu'on veut, et parfois on a un byte[], qu'on doit convertir en short[] construit à partir de paires de bytes du byte[]. Et c'est la mouise.

    Pour faire la conversion de deux bytes vers un short, c'est comme ça :

    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
    public static short bigEndianBytes2Short(byte b1, byte b2) {
      // shift de 8 bits.
      // En Java un shift convertit en int, donc on doit cast vers short
      short high = (short)(b1 << 8); 
     
      // Masquer les bits de poids fort, ne retenir que les 8 bits de poids faible.
      // Cela est nécessaire car b2 pourrait être négatif, auquel cas son extension sera négative aussi,
      // avec bits de poids fort à 1
      // En Java les opérateurs bit-à-bit convertissent en int, donc on doit caster vers short.
      short low = (short)(b2 & 0xFF);
     
      // Composer les deux.
      return (short)(high | low);
    }
     
    public static short littleEndianBytes2Short(byte b1, byte b2) {
       // version courte
      return (short)((b2 << 8) | (b1 & 0xFF));
    }
    Reste à appliquer le même traitement à tous les éléments d'un tableau pour remplir l'autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Socket][File] Envoyer un tableau de byte
    Par itsmii dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 30/01/2014, 09h10
  2. tableau de byte ou tableau d'integer
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/10/2008, 09h22
  3. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42
  4. [VB.NET] Tableau de bytes Lecture/Ecriture
    Par BenoitM dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/04/2005, 09h51
  5. [C#] Convertir un tableau de byte en Image
    Par goulhasch dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/01/2005, 10h12

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