Problème d'encodage

victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   -  
victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   -
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

dsy73 Messages postés 9252 Date d'inscription   Statut Contributeur Dernière intervention   2 485
 
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
victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   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
dsy73 Messages postés 9252 Date d'inscription   Statut Contributeur Dernière intervention   2 485 > victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
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
victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   1 > dsy73 Messages postés 9252 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
dsy73 Messages postés 9252 Date d'inscription   Statut Contributeur Dernière intervention   2 485 > victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
0
victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   1 > dsy73 Messages postés 9252 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
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
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
victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   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
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934 > victor1507 Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
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