Duplicata possible:
au niveau du bit XOR de nombres hexadécimaux en python
J'essaie de XOR deux chaînes hexadécimales dans Python et je ne savais pas vraiment par où commencer).
J'ai deux chaînes hexagonales:
a = "32510ba9a7b2bba9b8005d43a304b5714cc0bb0c8a34884dd91304b8ad40b62b07df44ba6e9d8a2368e51d04e0e7b207b70b9b8261112bacb6c866a232dfe257527dc29398f5f3251a0d47e503c66e935de81230b59b7afb5f41afa8d661cb"
b = "32510ba9babebbbefd001547a810e67149caee11d945cd7fc81a05e9f85aac650e9052ba6a8cd8257bf14d13e6f0a803b54fde9e77472dbff89d71b57bddef121336cb85ccb8f3315f4b52e301d16e9f52f90"
Dois-je utiliser cela?
return "".join([chr((x) ^ (y)) for (x,y) in Zip(a[:len(b)], b)])
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in Zip(a[:len(b)], b)])
Je ne comprends pas la différence avec les deux codes ci-dessus. Pourquoi chr
et ord
? J'ai également vu des gens utiliser int(hex,16)
.
Il vous manque deux ou trois choses ici.
Tout d'abord, vous ne voudrez pas XOR ces chaînes. Vous avez les chaînes sous une forme codée, par conséquent, vous devez .decode()
les d'abord :
binary_a = a.decode("hex")
binary_b = b.decode("hex")
Puis, comme déjà mentionné, la fonction Zip()
cesse d'itérer dès que l'une des deux séquences est épuisée. Aucun découpage n'est nécessaire.
Vous avez besoin de la deuxième version de la boucle: Tout d'abord, vous voulez obtenir la valeur ASCII des caractères: ord()
produit un nombre. Ceci est nécessaire car ^
ne fonctionne que sur les chiffres.
Après avoir XOR les nombres, vous convertissez ensuite le nombre en un caractère avec chr
:
def xor_strings(xs, ys):
return "".join(chr(ord(x) ^ ord(y)) for x, y in Zip(xs, ys))
xored = xor_strings(binary_a, binary_b).encode("hex")
En utilisant .encode()
à la fin, nous récupérons la chaîne binaire dans un formulaire, qui s'imprime bien.
int('', 16)
convertit une chaîne hexadécimale en un entier utilisant la base 16:
>>> int('f', 16)
15
>>> int('10', 16)
16
Faites donc ceci:
result = int(a, 16) ^ int(b, 16) # convert to integers and xor them together
return '{:x}'.format(result) # convert back to hexadecimal