Problème d'encodage

Fermé
victor1507 Messages postés 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 - 5 janv. 2017 à 17:49
victor1507 Messages postés 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 - 15 janv. 2017 à 10:32
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 dimanche 22 août 2010 Statut Contributeur Dernière intervention 23 octobre 2020 2 476
6 janv. 2017 à 06:35
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 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1
6 janv. 2017 à 16:17
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 dimanche 22 août 2010 Statut Contributeur Dernière intervention 23 octobre 2020 2 476 > victor1507 Messages postés 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018
7 janv. 2017 à 05:09
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 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1 > dsy73 Messages postés 9252 Date d'inscription dimanche 22 août 2010 Statut Contributeur Dernière intervention 23 octobre 2020
7 janv. 2017 à 10:40
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 dimanche 22 août 2010 Statut Contributeur Dernière intervention 23 octobre 2020 2 476 > victor1507 Messages postés 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018
7 janv. 2017 à 12:25
0
victor1507 Messages postés 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1 > dsy73 Messages postés 9252 Date d'inscription dimanche 22 août 2010 Statut Contributeur Dernière intervention 23 octobre 2020
7 janv. 2017 à 12:38
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 7/01/2017 à 22:26
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 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1
7 janv. 2017 à 23:34
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934 > victor1507 Messages postés 40 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018
Modifié par jisisv le 8/01/2017 à 02:27
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