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

Langage Java Discussion :

manipulation de bits d'un byte


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Points : 274
    Points
    274
    Par défaut manipulation de bits d'un byte
    Salut,
    Certains voiront pas l'intérêt mais j'ai vraiment besoin de pouvoir créer un byte depuis une séquence de 8 bits, cette séquence peut etre de type string ou un entier. J'ai aussi besoin de lire un byte, bit par pit.
    Je pensais qu'il y aurait un tas de solution mais ce n'est pas le cas
    "L'imagination est plus importante que la connaissance." - Albert Einstein.

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    java.util.BitSet pourrait t'aider, non?

  3. #3
    Membre actif Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Points : 274
    Points
    274
    Par défaut
    java.util.BitSet pourrait t'aider, non?
    oui les methodes proposées sont trés bien en plus mais il semblerait que c'est plus adapté aux "grosses quantités" et inadapté aux accés rapides .
    Je suis dans le 2ème cas: j'essaye de minimiser la taille des paquets échangés entre un serveur de jeu et les clients, et donc à la place d'envoyer des chaines de charactere j'ecris chaque donnée (seulement des entiers) en base 2. Chaque portion de donnée fait X bits. J'assemble ces données en une chaine de bits: "01101000100101" buis je la distribue par 8bits dans un tableau de byte qu'il ne reste plus qu'a envoyer.
    J'ai enfin trouvé comment faire lol :

    si je veux envoyer les coordonnées d'un point : x10=110, y10=200
    (chaque composante sur 10bits par exemple donc 1023 possibilités chacune)
    j'écris les deux en binaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String x2=Integer.toBinaryString(x);String y2=Integer.toBinaryString(y);[/
    j'assemble les deux chaines:
    ensuite faut une fonction qui coupe la chaine par lot de 8 bits et qui les stock dans un tableau de bytes (voir : parseInt(String s, int radix) de la classe Integer)

    Pour récupérer le point, il faut récupérer le tableau de bytes, et pour chaque byte, appliquer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String byteBinaryString = Integer.toBinaryString(TableauBytes[i]);
    Il faut assembler toutes ces chaines, puis les désassembler selon les données qu'on est sensé avoir: ici il faudra prendre les 10 1ers bits pour x et les 10 seconds pour y.

    Voilà, c'est sacrément tiré par les cheveux mais j'ai pas trouvé d'autre moyen
    "L'imagination est plus importante que la connaissance." - Albert Einstein.

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par orelero
    si je veux envoyer les coordonnées d'un point : x10=110, y10=200
    (chaque composante sur 10bits par exemple donc 1023 possibilités chacune)
    j'écris les deux en binaires:
    Précisément, 1024

    Dans ce cas, tu peux les stocker dans un entier de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int x10 = 110;
    int y10 = 200;
    int result = x10 << 10 | y10;
    Tu as ton entier (donc sur 4 bytes) qui contient ce que tu veux...

    Pour récupérer les octets d'un int, il suffit de faire ça (à moins qu'une méthode n'existe déjà):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    byte[] tab = new byte[4];
    byte[0] = (byte) result;
    byte[1] = (byte) (result >> 010);
    byte[2] = (byte) (result >> 020);
    byte[3] = (byte) (result >> 030);
    (0 est l'octet de poids faible, 3 l'octet de poids fort)

    Mais bon sur le réseau, tu peux envoyer tes entiers, ça serait pas mieux?
    Ou alors au moins découpe pas en 10 bits, mais en blocs de 8 (16 bits par exemple).

    Sinon concernant ton traitement avec les String, c'est vachement plus lourd qu'un BitSet

  5. #5
    Membre actif Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Points : 274
    Points
    274
    Par défaut
    merci beaucoup ®om !!!!!! Je connais rien en opérations binaires
    C'est ça que j'attendais en fait
    Mais bon sur le réseau, tu peux envoyer tes entiers, ça serait pas mieux?
    Je suis assez limité en upload sur le serveur et je cherche à économiser chaque byte envoyé , vu que je n'ai pas toujours besoin des 4 bytes d'un entier, je dois partitionner les données presque au strict minimum.
    Sinon concernant ton traitement avec les String, c'est vachement plus lourd qu'un BitSet
    Ouai c'est sûr. En fait j'aurai pû faire la meme chose avec stringbuilder.
    A propos de ça, est ce que tu sais si Javolution (cf Text, TextBuilder) est utilisé dans des applications serveurs/clients ?
    "L'imagination est plus importante que la connaissance." - Albert Einstein.

  6. #6
    Membre actif Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Points : 274
    Points
    274
    Par défaut
    sinon, est-ce qu'un operateur binaire peut-etre appliqué à autre chose qu'un type primitif ? Parceque j'aimerai pouvoir stocker des données dans un type qui s'ecrit sur 300bytes... et le mieux qu'on puisse trouver c'est double: 8 bytes .

    edit: BigInteger semble bien correspondre
    edit2: BigInteger est immutbale mais j'ai vu que Jscience proposais à quelque chose prés la meme chose sauf c'est "mutable" (8fois plus rapide sur certaines operations d'apres leur benchmark!).
    "L'imagination est plus importante que la connaissance." - Albert Einstein.

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Points : 379
    Points
    379
    Par défaut
    Tu ne peux pas utiliser les opérateurs binaire sur autre chose que les byte/short/int/long.

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

Discussions similaires

  1. récupérer les bits d'un byte
    Par ToTo13 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2006, 16h25
  2. [Ada] Manipulation de "Bits"
    Par BoBy9 dans le forum Ada
    Réponses: 2
    Dernier message: 14/06/2006, 11h57
  3. Manipulation de bits
    Par Tsly dans le forum C++
    Réponses: 2
    Dernier message: 28/09/2005, 12h41
  4. Accéder facilement à chaque bit d'un byte
    Par bobby-b dans le forum Langage
    Réponses: 6
    Dernier message: 10/07/2004, 14h07
  5. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42

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