Python3.6 : convertire un 'generator' en 'b-like'

Résolu/Fermé
Utilisateur anonyme - Modifié le 30 sept. 2018 à 10:26
 Utilisateur anonyme - 30 sept. 2018 à 12:29
Bonjour,

je debute totalement en python3 et je me retrouve face a un bug que je ne parvien pas a resoudre.

Traceback (most recent call last):
  File "prog05", line 20, in <module>
    main()
  File "prog05", line 16, in main
    print(cipherXOR(fd.readline(), fd.readlines()))
  File "prog05", line 11, in cipherXOR
    return hexlify(''.join(xor_char(c, k)) for c,k in zip(msg, cycle(key)))
TypeError: a bytes-like object is required, not 'generator'


cette erreur ne semble pas etre tres connue sur google car je n'est rien trouvé ...

voici mon code :

#!/usr/bin/python
from binascii import hexlify, unhexlify
from itertools import cycle
import sys


def xor_char(c1, c2):
    return chr(ord(c1) ^ ord(c2))

def cipherXOR(key, msg):
    return hexlify(''.join(xor_char(c, k)) for c,k in zip(msg, cycle(key)))

def main():
    for arg in sys.argv[1:]:
        with open(arg, "r") as fd:
            print(cipherXOR(fd.readline(), fd.readlines()))
        fd.close()

if __name__ == "__main__":
    main()




1 réponse

Bonjour.

Je ne sais pas ce qu'est supposé faire votre script.

Il y a un problème car votre générateur n'est pas dans le join, de plus hexlify attend un type byte en argument.

Ce qui fait que votre fonction devrait ressembler à :

def cipherXOR(key, msg):
    return hexlify(''.join(xor_char(c, k) for c,k in zip(msg, cycle(key))).encode())


Autre chose, il n'est pas nécessaire d'utiliser close sur vos fichiers si vous utilisez with.
0
merci de ta reponse rififi.

mon scipt prend en parametre le nom d'un fichier, il recupére la premiere ligne de ce fichier qui correspond a la clé de chiffrage dans lequel le reste de ce méme fichier doit etre chiffré avec le system : repeating key XOR

mais etant debutant sur le python j'imagine que ce n'est probablement pas la meilleurs des solution pour repondre a ce probléme. je suis a ton ecoute si tu as mieux a me proposer .

j'ai corrigé ma fonction tel que tu me la proposé, mais mon programme reste buger ...

si tu peut me venir en aide la dessus egalement ce serais top.

File "prog05", line 8, in xor_char
    return chr(ord(c1) ^ ord(c2))
TypeError: ord() expected a character, but string of length 80 found


cette erreur je la comprend mais pour la corriger ca va etre coton. une boucle j'imagine ...
0
rififi > Utilisateur anonyme
30 sept. 2018 à 12:15
En effet une boucle convient à faire cela, key représente une chaine de caractères, tandis que msg est une liste de chaines de caractères, sachant cela, il suffit de passer chaque ligne à votre fonction.

def main():
    for arg in sys.argv[1:]:
        with open(arg, "r") as fd:
            key = fd.readline().strip()
            for line in fd.readlines():
                print(cipherXOR(key, line.strip()))


Mais rien ne vous empêche de créer une fonction intermédiaire pour faire cela, c'est à vous de voir :)
0
Utilisateur anonyme
30 sept. 2018 à 12:29
c'est effectivement bien plus logique et optimisé de cette manière . Etant habitué au C et Cpp je me suis compliqué la vie pour pas grand chose semble t'il ...

merci de votre aide, cela fonctionne presque parfaitement.
je doit juste avoir un soucis dans mon operation mais je devrait pouvoir la corriger seul .

passe un agréable Dimanche.
0