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

API standards et tierces Java Discussion :

Faire un XOR sur une chaine/long binaire TRES/TROP longue


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Par défaut Faire un XOR sur une chaine/long binaire TRES/TROP longue
    Bonjour,

    J'ai un petit problème avec l'utilisation d'un XOR.

    En effet, j'ai deux String qui représentent en réalité chacun un code héxadécimal (mais bon.. qu'importe), et je dois faire un XOR entre ces deux chaines.
    Ma première chaine est la suivante:
    String o1 = "63cc5fb23fbc4de060e38437898de623"
    Ma seconde: String d2 = "673000114F38fc00"

    J'ai lu que pour faire le XOR il fallait au préalable convertir la chaine en un String de binaire, puis la parser en tant que Long et faire ensuite le XOR.
    Ainsi, cela donne le code suivant:

    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
     
    //Conversion de o1 en binaire
    StringBuffer buffo1 = new StringBuffer();
       for (int i = 0; i < o1.length(); i++) {
    	buffo1.append(StringUtils.leftPad(Integer.toBinaryString(Integer
    	.parseInt(String.valueOf(o1.charAt(i)), 16)), 4,
    	"0"));
       }
     
    StringBuffer buffd2 = new StringBuffer();
       for (int i = 0; i < d2.length(); i++) {
    	buffd2.append(StringUtils.leftPad(Integer.toBinaryString(Integer
    	.parseInt(String.valueOf(d2.charAt(i)), 16)), 4,
    	"0"));
       }

    J'ai donc bien deux buffers contenant ma chaine représentée en binaire
    Il ne me reste ainsi qu'à faire le XOR dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    long lbuf2 = Long.parseLong(buffd2.toString(), 2);
    long lbuffo1 = Long.parseLong(buffo1.toString(), 2);
     
    long resultXOR = lbuf2 ^ lbuffo1;
    Le problème c'est que lors du parseLong de mon buffer de mon premier String, celui-ci étant trop long, cela plante...


    java.lang.NumberFormatException: For input string: "01100011110011000101111110110010001111111011110001001101111000000110000011100011100001000011011110001001100011011110011000100011"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)

    Alors du coup, comment puis-je faire ??

    Je ne sais vers quoi partir, je suis un peu dans la panade
    Réaliser ce genre de chose n'est pas habituel pour moi, et du coup, je galère un peu là

    Je vous remercie tous pour votre aide

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Bonjour,

    Que ce soit short, int ou long, ca ne change rien : la taille est limité, il faut découper ton String et procéder par bloc.

    Bon courage,

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    c'est quoi ces bidouilles avec les stringbuffers? Je comprend même pas ce qu'est censé faire ce code


    Ceci devrait suffire, en utilisant des BigInteger vu la taille de vos données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		String o1 = "63cc5fb23fbc4de060e38437898de623";
    		String d2 = "673000114F38fc00";
    		BigInteger l1 = new BigInteger(o1,16);
    		BigInteger l2 = new BigInteger(d2,16);
    		BigInteger resultat = l1.xor(l2);
    		System.out.println(resultat.toString(16));

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    On dirait que tu veux faire du padding à gauche en fonction de la taille de tes Strings. Il y a une raison ?
    Quoi qu'il en soit prend le type qui convient a ton traitement.

  5. #5
    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
    Il y a quand même un petit problème, c'est que les deux chaînes ne contiennent pas le même nombre de chiffres. Comment on fait un xor entre deux séries de bits de longueurs différentes ??
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Par défaut
    tchize_, ça marche impec ! Merci
    Jimmy_ non le padding ne sert à rien ici. C'est juste que je l'ai récupéré sur une autre fonction

    thelvin: En effet, c'était une question que je gardais pour la fin
    En fait, je dois suivre un algo bien défini. En gros, un première chaine passe dans un DES , et on fait un XOR sur le résultat de ce DES et la troisième chaine.
    Le prob est que le résultat du DES est bien plus long que ma troisième chaine...

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Par défaut
    slt,

    Je ne suis pas contre le couper, mais par rapport à mon XOR, comment faire pour que le résultat soit correct ?

    Je ne suis pas à l'aise avec ce genre de choses Comment dois je donc faire pour faire bit à bit par exemple, avec un résultat valide ?

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Par défaut
    Merci tchize_, j'essaie ça !

    L'histoire des buffers, c'est clair c'est des bidouilles pourries, des compilations de bouts de code...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/11/2012, 11h23
  2. Réponses: 7
    Dernier message: 15/07/2011, 05h35
  3. Faire un < sur une chaine de caractère
    Par Space Cowboy dans le forum Requêtes
    Réponses: 8
    Dernier message: 30/09/2009, 14h27
  4. Réponses: 3
    Dernier message: 27/04/2008, 19h10
  5. Comment faire un explode sur une chaine comme suit ?
    Par sebnutt dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 11h59

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