XOR Hex Ssortingng en JAVA de longueur différente

J’ai deux cordes

Ssortingng s1="426F62"; Ssortingng s2="457665"; 

Les chaînes sont en représentation hexadécimale. Je veux les XOR. XORing normalement caractère par caractère donne le résultat correct pour les autres sauf F XOR 6 (Il donne 112, la réponse doit être 9)

S’il vous plaît dites-moi la bonne façon de le mettre en œuvre dans JAVA

EDIT: Conversion en travaux int et xoring. Mais comment xor lorsque deux chaînes sont de longueur différente.

Plutôt que de convertir les représentations Unicode en XOR, convertissez simplement chaque caractère en nombre qu’il représente en hexa, ceux-ci en XOR, puis reconvertissez-le en hexadécimal. Vous pouvez toujours faire ça un caractère à la fois:

 public Ssortingng xorHex(Ssortingng a, Ssortingng b) { // TODO: Validation char[] chars = new char[a.length()]; for (int i = 0; i < chars.length; i++) { chars[i] = toHex(fromHex(a.charAt(i)) ^ fromHex(b.charAt(i))); } return new String(chars); } private static int fromHex(char c) { if (c >= '0' && c <= '9') { return c - '0'; } if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } throw new IllegalArgumentException(); } private char toHex(int nybble) { if (nybble < 0 || nybble > 15) { throw new IllegalArgumentException(); } return "0123456789ABCDEF".charAt(nybble); } 

Notez que cela devrait fonctionner quelle que soit la longueur des chaînes (tant qu’elles ont la même longueur) et que vous n’avez jamais à vous soucier des valeurs négatives – vous obtiendrez toujours le résultat de XORing pour chaque paire de caractères.

Essaye ça:

 Ssortingng s1 = "426F62"; Ssortingng s2 = "457665"; int n1 = Integer.parseInt(s1, 16); int n2 = Integer.parseInt(s2, 16); int n3 = n1 ^ n2; Ssortingng s3 = Ssortingng.format("%06x", n3); 

Pourquoi stockez-vous les valeurs hexadécimales sous forme de chaînes? ce serait une bien meilleure idée de représenter les nombres hexadécimaux en tant qu’entiers hexadécimaux ou en longueur

Le fait qu’il donne un résultat correct est un artefact du codage de caractères particulier pour les chiffres et les lettres. Vous devez convertir les nombres en BigInteger , les XOR et les reconvertir en Ssortingng :

 BigInteger i1 = new BigInteger(s1, 16); BigInteger i2 = new BigInteger(s2, 16); BigInteger res = i1.xor(i2); Ssortingng s3 = res.toSsortingng(16); 

EDIT (en réponse au commentaire de Jon Skeet): Utiliser BigInteger au lieu de int pour résoudre le problème de la limite de quatre octets.

Une autre option qui pourrait être utile en fonction de la taille des chaînes

 Ssortingng s1="426F62"; Ssortingng s2="457665"; BigInteger one = new BigInteger(s1, 16); BigInteger two = new BigInteger(s2, 16); BigInteger three = one.xor(two);