Problème d'encodage

victor1507 Messages postés 51 Statut Membre -  
victor1507 Messages postés 51 Statut Membre -
Bonjour a tous,

Je suis en train de dev un petit programme de cryptage (pour une utilisation personnelle) et j'ai un petit problème au niveau de l'encodage. Je m'explique : Mon programme récupère le contenu du fichier à crypter, récupère la valeur unicode de chaque caractère (avec ord()), la modifie en fonction du mot de passe, retrouve le caractère unicode correspondant (avec unichr()) et écrit la chiale cryptée dans un fichier. Pour les fichiers texte tout marche parfaitement, mais des que j'essaie de crypter un document Word par exemple, j'obtiens cette erreur :
UnicodeEncodeError: 'ascii' codec can't encode character u'\x81' in position 0: ordinal not in range(128)


J'ai fait quelque recherches et j'ai trouvé que c'est une erreur d'encodage. Quelqu'un sait-il quel encodage faut il utiliser ?

Victor

2 réponses

  1. dsy73 Messages postés 9003 Date d'inscription   Statut Contributeur Dernière intervention   2 547
     
    Salut
    1) "la chiale" ???
    2) Pourquoi ne pas mettre ton code ?
    3) Est-ce que ton code est capable de lire un fichier binaire (Word) en plus d'un fichier texte ?
    0
    1. victor1507 Messages postés 51 Statut Membre 1
       
      Dsy73,

      Merci pour cette réponse rapide ;)

      Premièrement j'ai fait une faute de frappe et ce n'est pas la"chiale" mais plutôt la "chaine".

      Pour le code, voici la fonction de cryptage (pour l'instant il faut encore que je change certains trucs au niveau de algorithme mais si tu as une idée pour l'améliorer ne te gêne pas ;) )
      def crypt():
      global cryptageprecendent
      fichier=open("Exemple.txt","rb")
      string=fichier.read()
      fichier.close()
      fichier=open("Exemple.txt","wb")
      password=raw_input("Mot de passe pour le cryptage : ")

      asciipass=map(ord, password)

      asciifile=map(ord, string)


      passlen=len(password)
      filelen=len(string)
      nbrtours=0
      toursafaire=filelen/passlen
      lasttour=filelen%passlen
      asciifilecrypt=[]
      for y in range(toursafaire):
      for x in range(0, passlen):
      valpass=asciipass[x]
      valfile=asciifile[x+nbrtours*passlen]
      nouvellevaleur=valpass+valfile
      if nouvellevaleur>256:
      nouvellevaleur=nouvellevaleur-256
      asciifilecrypt.append(nouvellevaleur)
      nbrtours+=1
      for x in range(0, lasttour):
      valpass=asciipass[x]
      valfile=asciifile[x+nbrtours*passlen]
      nouvellevaleur=valpass+valfile
      if nouvellevaleur>256:
      nouvellevaleur=nouvellevaleur-256
      asciifilecrypt.append(nouvellevaleur)
      filecrypt=map(unichr, asciifilecrypt)
      crypted="".join(filecrypt)
      fichier.write(crypted)
      fichier.close()
      0
    2. dsy73 Messages postés 9003 Date d'inscription   Statut Contributeur Dernière intervention   2 547 > victor1507 Messages postés 51 Statut Membre
       
      Ton code ne traite pas les fichiers binaires vu que tu utilises la fonction ord(), reprends de zéro en oubliant les codes ASCII.
      0
    3. victor1507 Messages postés 51 Statut Membre 1 > dsy73 Messages postés 9003 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Merci dsy73,

      Tu me dis de ne pas utiliser la fonction ord(). Mais comment faire pour récupérer le fichier a crypter sous forme binaire ?
      0
    4. victor1507 Messages postés 51 Statut Membre 1 > dsy73 Messages postés 9003 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Ok merci beaucoup ! Je teste et je te dis si ça marche (je ne devrais plus avoir d'erreurs
      UnicodeEncodeError
      ?)
      0
  2. jisisv Messages postés 3678 Statut Modérateur 936
     
    Qu'est ce que Unicode vient faire avec l'encryptage. Ton output sera en général un flux binaire.
    Ouvre tes fichiers en mode binaire et basta.
    #!/usr/bin/python
    
    buffersize = 1024
    buffer = ''
    
    FILO ='/bin/ls'
    FILDEST = 'brol'
    
    def proceed_buffer(buffer):
        """Trivial encryption"""
        return buffer
    
    try:
        hd = open(FILO, "rb")
        hdout = open(FILDEST, "wb") 
    except:
        exit
    
    buffer = hd.read(buffersize)
    
    while len(buffer) != 0 :
        result  = proceed_buffer(buffer)
        result  = proceed_buffer(buffer)
        hdout.write(result)
    
        buffer = hd.read(buffersize)
    
    hd.close()
    hdout.close()


    Gates gave ^W  sold  you the windows.
    GNU gave us the whole house.(Alexandrin)
    0
    1. victor1507 Messages postés 51 Statut Membre 1
       
      Bonsoir,

      Merci pour ta réponse mais si tu regardes dans le code que j'ai mis un peu plus haut, tu verras que j'ouvre déjà les fichiers en binaires, mais python ne veut pas encoder les caractères que ma fonction retourne dans le fichier de destination et lève une erreur. Après j'ai peut être mal compris ce que tu as voulu me dire, mais ce que tu me propose ne solutionne pas mon problème.

      Bien a toi,
      Victor
      0
      1. jisisv Messages postés 3678 Statut Modérateur 936 > victor1507 Messages postés 51 Statut Membre
         
        A la limite utilise une liste de bytes, par exemple
        #!/usr/bin/python
        buffersize = 1
        FILO ='truc'
        
        def proceed_buffer(buffer):
            return buffer
        
        try:
            hd = open(FILO, "rb")
        except:
            exit
        
        buffer = []
        buffer.append( hd.read(buffersize))
        while len(buffer[0]) :
            print(ord(buffer[0]))
            buffer = []
            buffer.append( hd.read(buffersize))
        
        hd.close()


        Exécution:
        johand@bata:~/src/CCM/PYTHON$ echo -n "éé" > truc
        johand@bata:~/src/CCM/PYTHON$ python test_encrypt.py
        195
        169
        195
        169

        Utilise la taille maximale de la liste qui te convient à tes besoins pour la fonction de cryptage.
        0