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

Entrée/Sortie Java Discussion :

convertir a unsigned byte[] vers un objet


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut convertir a unsigned byte[] vers un objet
    Bonjour

    Un système Electronique via le port série m'envoie des trames.
    Ces trames de longueur variables sont la réponse à une commande particulière.

    A une commande particulière, la définition de la trame de réponse est contenue dans une classe.
    Je dois donc convertir mon flux de port série en une classe pour une commande particulière (environ 200 commandes différentes)

    Mon souci est que le flux du port série contient des unsigned byte (provient d'un DSPIC microchip ou le développeur avait ce type en C)

    Je cherche donc un moyen pour transformer mon byte[] en une classe sans avoir a reinterpreter chaque commande de retour. (j'en ai fait une pour tester en castant tout les byte en int & 0xFF mais c'est laborieux)

    en cherchant un peu sur la toile j' ai trouvé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static Object MarshaltoObject(byte[] bytes){
        Object object = null;
        try{
               object = new java.io.ObjectInputStream(new  java.io.ByteArrayInputStream(bytes)).readObject();
                }catch(java.io.IOException ioe){
                java.util.logging.Logger.global.log(java.util.logging.Level.SEVERE,ioe.getMessage());
                }
                catch(java.lang.ClassNotFoundException cnfe){
                java.util.logging.Logger.global.log(java.util.logging.Level.SEVERE,cnfe.getMessage());
                }
        return object;
        }
    mais evidemment avec met unsigned byte je me prend une magnifique exception Stream Corrupted Exception : invalid stream header.
    Comment puis je automatiser en java un convertion Unsigned byte[] to object, toutes les fonctions que je trouve prennent des signed byte en java et rien n'utilise un short[] ou un int[]?
    Suis je obliger de me taper un reinterpretation de toute les trames pour chaque variables de met 200 classes de retour ?

    Cordialement

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je ne comprend pas : tu utilises la serialisation !
    Ca veut dire que le système électronique t’envoie directement une classe Java ?!?

    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Voici un exemple.
    J'envoie la command HelloWorld à la carte, elle me renvoie
    "0089897192370101210103"

    cette information correspond à une classe
    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
    public class PbRspGetHelloWorld
    {
          public byte completionStatus;
          public DeviceInfoType DeviceInfo = new DeviceInfoType();
    }
     
    public class DeviceInfoType {
        public long deviceId;
        public DeviceDescriptionType description;
    }
     
    public class DeviceDescriptionType {
     
        public int deviceTypeMajor;
        public int deviceTypeMinor;
        public int softwareVersionMajor;
        public int softwareVersionMinor;
        public int hardwareVersionMajor;
        public int hardwareVersionMinor;
    }

    donc
    Le 00 est le byte completionStatus
    Le 89897192 est le long deviceId
    Le 37 est le int deviceTypeMajor
    Le 01 est le int deviceTypeMinor
    Le 01 est le int softwareVersionMajor;
    .....

    Mon idee etait donc de transformer cette Hex string en byte[],
    puis transformer le byte [] en object PbRspGetHelloWorld pour ne pas avoir a décoder cela dans les 200 différentes trames de retour.

    Pour info, cette carte marche classiquement avec un prog en .net mais j'essaie de faire la même chose pour un SDK en java.

    Cordialement

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    - Pour transformer un byte en int, en considérant le byte comme unsigned, on fait, effactivement, ceci :

    - Pour transformer 4 bytes en long, en considérant que c'est un unsigned int de 32 bits big-endian, il faut faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int i =
      (byte1 << 24) |
      ((0xFF & byte2) << 16) |
      ((0xFF & byte3) << 8) |
      (0xFF & byte4);
    long l = 0xFFFFFFFFL & i;
    Rien n'empêche de créer des méthodes utilitaires pour le faire une fois pour toutes.

    Edit : maintenant que j'y pense, adiGuba a raison : si on part d'une String, à quoi ça sert de s'imposer des bytes au milieu ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    C'est une simple String. Il suffit de la découper et de lire les données qu'il y a dedans... Je ne comprend pas pourquoi tu cherchais à déserialiser !?


    a++

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    L’idée est d'automatiser, si une trame de réponse est un
    int, int, long, short
    et une autre
    long, int, short, long faut faire pour chaque trame le détramage

    je cherche a passer par une methode générale du string à l'object.
    Cela se fait très bien en .net de byte[] à object

    Cordialement

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Tu dois pouvoir automatiser cela en passant par la reflection...

    Par contre il va te falloir savoir à l'avance l'objet de destination...


    Citation Envoyé par ricky78 Voir le message
    Cela se fait très bien en .net de byte[] à object
    En standard ???
    Bizarre car c'est quand même un cas d'utilisation très spécifique...

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un unsigned int vers un long double
    Par dafpp dans le forum Débuter
    Réponses: 3
    Dernier message: 28/01/2012, 19h37
  2. Réponses: 8
    Dernier message: 20/06/2008, 14h47
  3. Convertir BYTE[] vers char *
    Par LordBob dans le forum C++
    Réponses: 4
    Dernier message: 13/10/2007, 10h04
  4. Convertir un array<Byte>^ en unsigned char*
    Par xxiemeciel dans le forum C++/CLI
    Réponses: 5
    Dernier message: 12/06/2007, 20h23
  5. Convertir un byte en unsigned byte
    Par ToTo13 dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2007, 17h21

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