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 :

XOR en hexa ?


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut XOR en hexa ?
    salut tout le monde
    je cherche une methode si elle existe déjà ou à faire une fonction qui exor ( XOR ) deux Strings composés des valeurs en hexa ( je sais pas si c'est clair ou pas )
    sinon un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string ch1 = "123456780000F002"
    string ch2 = "000000000000FF00"
     
    ch1 XOR ch2 = "1234567800000F02"
    merciiiiiiiiiiiiiii

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ca ça donne quoi ? (pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string ch1 = "123456780000F002";
    string ch2 = "000000000000FF00";
     
    byte[] bytes1 = ch1.getBytes();
    byte[] bytes1 = ch2.getBytes();
    byte[] result = new byte[bytes1.length];
     
    for (int i=0;i<bytes1;i++)
      result[i] = bytes1[i]^bytes2[i];
     
    System.out.println(new String(result));

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    merci chtig
    même aprés avoir corriger quelques petite fautes de frape de votre part ( genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] bytes2 = ch2.getBytes();
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] bytes1 = ch2.getBytes();
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0;i<bytes1.length;i++)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0;i<bytes1;i++)
    ca me mis une erreure
    Non concordance de types : impossible de convertir de int en byte
    pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result[i] = bytes1[i]^bytes2[i];
    t'a pas une idée ? et si ca prend en charge l'hexa ou non ?
    merci encore

  4. #4
    Membre éclairé Avatar de Liquidsoul
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut
    Citation Envoyé par bwwilly
    ca me mis une erreure

    pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result[i] = bytes1[i]^bytes2[i];
    t'a pas une idée ? et si ca prend en charge l'hexa ou non ?
    merci encore
    Salut,

    Si je ne me trompe pas l'opérateur "^" doit certainement te renvoyer un int(32bits) au lieu d'un byte(8bits), donc il te suffit de caster la partie du int qui t'intéresse en byte.
    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result[i] = (byte)((bytes1[i]^bytes2[i]) & 0xFF);
    Après je ne suis pas sur que le "& 0xFF" soit indispensable.

    J'espère avoir pu aider

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    oui merci Liquidsoul j el'ai déjà remarqué et je l'ai ajouté le (byte) mais le code suivant me donne en résultat :

    V
    et même avec
    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
     
    public static void main (String[] args){
    		String varData1, varData2;
    		varData1= "123456780000F002";
    		varData2= "000000000000FF00";
     
    	   	byte[] bytes1 =  (varData1.getBytes());
    		byte[] bytes2 = varData2.getBytes();
    		byte[] result = new byte[bytes1.length];
     
    		for (int i=0;i<bytes1.length;i++)
    			 result[i] =  (byte)(bytes1[i]^bytes2[i]);
     
    		System.out.println( new String(result));
     
    	   }
    c'est bizarre non ? !!

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Oups désolé pour les fautes de frappe j'ai effectivement tapé ça vite et directement sur le forum ...
    Effectivement, je pense un simple cast en byte suffit (tiens, j'ai appris un truc : byte ^ byte -> int ça m'étonne mais bon ...)
    Quant à gérer l'hexa, j'avoue que je ne comprends pas trop .... En fait l'exemple que tu donnais ne présentait pas de cas où tu as deux caractères sans que aucun ne soit 0 ... Donc pour l'instant je ne vois pas le rapport avec l'hexa ...

  7. #7
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Euh ! En fait je suis très bête (forcément que ça ne fonctionne pas ... je sais pas ce que j'avais bu, mais là je prends les octets des caractères dont ca fait totalement n'importe quoi). Je te reposte un truc dans deux min

  8. #8
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    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
     
    public static void main (String[] args){
    		String varData1, varData2;
    		varData1= "123456780000F002";
    		varData2= "000000000000FF00";
     
    	   	StringBuffer result = new StringBuffer();
     
    		for (int i=0;i<varData1.length/2;i++) {
    		  int n1 = Integer.decode(varData1.substring(i*2,i*2+1)).intValue();
                                int n2 = Integer.decode(varData2.substring(i*2,i*2+1)).intValue();
                               result.append(Integer.toHexString(n1^n2));
                              }
     
    		System.out.println(result.toString());
     
    	   }

  9. #9
    Membre éclairé Avatar de Liquidsoul
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut
    Citation Envoyé par bwwilly
    c'est bizarre non ? !!
    Bah moi je dirais que c'est parce que tu espères que la classe String comprenne que ce qu'elle contient est une représentation hexadécimale d'un nombre
    En fait le String.getBytes va te renvoyer l'encodage de tes caractères dans un tableau de bytes. C'est à dire par défaut l'encodage en UTF-8 (si je me trompe pas dans le format par défaut) de ta chaine.
    Donc il va te sortir pour chaque caractère de ta chaine l'encodage en UTF-8.

    Et pour la sortie c'est tout pareil il espère trouver un encodage UTF-8 alors que c'est une modification bit à bit de chacun des bytes initiaux

    Utilise plutôt les fonctions de la classe Integer (enfin suivant l'utilisation que tu veux )

    EDIT: chtig a meme fait la solution

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    merci Liquidsoul
    merci chtig pour ta solution, c'est un peut difficile de trouver ça pour un débutant de mon genre
    mais j'ai exécuté le code te ca génère cette exception :

    Exception in thread "main" java.lang.NumberFormatException: For input string: "F"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)
    at java.lang.Integer.decode(Unknown Source)
    at tempo.main(tempo.java:27)
    la ligne 27 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n1 = Integer.decode(varData1.substring(i*2,i*2+1)).intValue();
    sachant que j'ai juste ajouter à ton code un () aprés length que t'a du oublié je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i=0;i<(varData1.length())/2;i++)
    et lorsque je débuge ca me sort comme résultat :
    [1, 3, 5, 7, 0, 0, , , , , , , , , , 
    merci encore et tjrrrrrrrr

  11. #11
    Membre éclairé Avatar de Liquidsoul
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut
    En fait tout ce qu'il manque je pense c'est dans tes chaines représentant des valeur hexa un "0x" pour l'utilisation de la fonction decode.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String str = "0xFFE000384"
    Sinon il faut utiliser la fonction parseInt de la classe Integer

  12. #12
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    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
    21
    22
    23
    24
    25
    26
    27
    /**
             * Donne la valeur du xor (ou exclusif) entre le byte a et le byte b
             * @param a le premier byte
             * @param b le deuxième byte
             * @param byte La valeur du xor entre a et b
             */
    	protected final byte xor(byte a, byte b) {
    		return (byte) (a ^ b);
    	}
     
    	/**
             * Donne la valeur du xor (ou exclusif) entre le tableau de byte a et b
             * @param a le premier tableau de byte
             * @param b le deuxième tableau de byte
             * @param byte La valeur du xor entre le tableau de byte a et b
             */
    	protected final byte[] xor(byte[] a, byte[] b) {
    		if (a == null || b == null || a.length != b.length)
    			return null;
     
    		byte[] c = new byte[a.length];
     
    		for(int i =0; i< a.length; i++)
    			c[i] = xor(a[i], b[i]);
     
    		return c;
    	}

    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
    21
    22
    /**
             * Conversion d'un chaine de caractères en tableau de bytes
             * @param string La chaine à convertir
             * @return byte[] Le résultat après convertion
             */
    	public final byte[] stringToBytes(String string) {
    		return string.getBytes();
    	}
     
    	/**
             * Conversion d'un tableau de bytes en chaine de caractères
             * @param bytes Le tableau de byte à convertir
             * @return String Le résultat après convertion
             */
    	public final String bytesToString(byte[] bytes) {
    		String string = null;
     
    		if (bytes != null)
    			string = new String(bytes);
     
    		return string;
    	}

    Si ca peut t'aider

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    merci billynirvana mais ca me donne tjr la même résultat , il faut pas oublier que mes String sont en hexa; donc on a pas que des 0 et 1 mais aussi d'autre chiffre et même des lettres ( A , B ...., F) et par exemple :
    9 XOR 3 = A
    6 XOR B = D
    4 XOR 7 = 3
    ....
    alors quelqu'un une idée SVP
    merci

  14. #14
    Membre éclairé Avatar de Liquidsoul
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    String varData1, varData2;
            varData1= "123456780000F002";
            varData2= "000000000000FF00";
     
            StringBuffer result = new StringBuffer();
     
            for (int i=0;i<varData1.length();i++)
            {
                int n1 = Integer.parseInt(varData1.substring(i,i+1), 16);
                int n2 = Integer.parseInt(varData2.substring(i,i+1), 16);
                result.append(Integer.toHexString(n1^n2));
            }
     
            System.out.println(result.toString());
    Ca ne corrigerait pas ton problème ca?

  15. #15
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Effectivement désolé pourtant j'y avais pensé mais j'ai oublié ça ...
    Donc soit tu mets 16 en deuxième paramètre soit tu concatènes un "0X" devant ("0X"+varData1.substring(i,i+1))

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    si si
    mais en plus j'ai trouvé une solution générale (et je viens de la tester et ca marche ) et je vous remerci tous pour votre aide

  17. #17
    Membre éclairé Avatar de Liquidsoul
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Par défaut
    Citation Envoyé par bwwilly
    si si
    mais en plus j'ai trouvé une solution générale (et je viens de la tester et ca marche ) et je vous remerci tous pour votre aide
    N'hésite pas à partager ta solution pour ceux qui aurait le même problème que toi

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Par défaut
    ah ok dsl
    voila ce que j'ai fais et ca marche !
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    public static String XOR(String varData1, String varData2) {
    	    String out = "";
     
    	    if (varData1.length() == varData2.length()) {
    	      byte[] ta = hex2BinArray(varData1);
    	      byte[] tb = hex2BinArray(varData2);
     
    	      for (int i = 0; i < ta.length; i++) {
    	        ta[i] = (byte) (ta[i] ^ tb[i]);
    	      }
     
    	      out = MacrosInterface.binArray2Hex(ta);
    	    }
     
    	    return out.toUpperCase();
    	  }
     
    	/**
               * transform an hex string (representing bytes) in a byte array<br>
               * ex : "12AB" => [(byte)0x12],[(byte)0xAB]
               * @param String intput hexadecimal string
               * @return byte[]
               */
    	  public static byte[] hex2BinArray(String input) {
    	    if ((input.length() % 2) == 0) {
    	      byte[] output = new byte[input.length() / 2];
     
    	      for (int i = 0; i < (input.length() / 2); i++) {
    	        output[i] = (byte) Integer.parseInt(
    	            input.substring(i * 2, (i * 2) + 2), 16);
    	      }
     
    	      return output;
    	    } else {
    	      return null;
    	    }
    	  }
    	  /**
               * transform a byte array in an hex string<br>
               * ex : [(byte)0x12],[(byte)0xB] => "120B"
               * @param byte[] intput byte array
               */
    	  public static String binArray2Hex(byte[] input) {
    	    StringBuffer output = new StringBuffer("");
     
    	    if (input != null) {
    	      for (int i = 0; i < input.length; i++) {
    	        short intern = (short) (input[i] & (short) 0x00FF);
    	        output.append(leftZeroPad(Integer.toHexString(intern), 2));
    	      }
    	    }
     
    	    return output.toString().toUpperCase();
    	  }
     
    	  /**
               * add "0" to the left of the input string until length equals digitNumber value
               * @param String input
               * @param int digitNumber final number of digit
               */
    	  public static String leftZeroPad(String input, int digitNumber) {
    	    String out = "";
     
    	    if (input != null) {
    	      out = input;
    	    }
     
    	    if (digitNumber > out.length()) {
    	      while (out.length() < digitNumber)
    	        out = "0" + out;
    	    }
     
    	    return out.toUpperCase();
    	  }
    Merci encore à tout le monde

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

Discussions similaires

  1. conversion : (Ascii en hexa) => nombre
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 21/04/2004, 15h44
  2. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 17h05
  3. technique du XOR
    Par microseb dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/08/2003, 00h55
  4. [débutant] conversion int en hexa
    Par sergoid dans le forum C++Builder
    Réponses: 6
    Dernier message: 16/05/2003, 12h11

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