Signaler

Problème d'encodage

Posez votre question victor1507 31Messages postés lundi 15 février 2016Date d'inscription 23 janvier 2017 Dernière intervention - Dernière réponse le 15 janv. 2017 à 10:32 par victor1507
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
Afficher la suite 
Utile
+0
moins plus
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 ?
victor1507 31Messages postés lundi 15 février 2016Date d'inscription 23 janvier 2017 Dernière intervention - 12 janv. 2017 à 17:42
dsy73,

Merci pour ta réponse. Lorsque j'utilise le code de stackoverflow j'obtiens une chaine de caractères. Saurais-tu comment convertir en nombre hexadécimal ??

Par ailleurs, saurais-tu comment réécrire les bytes dans le fichier de destination pour qu'il soit lisible ??

Bien a toi,
Victor
Répondre
dsy73 8904Messages postés dimanche 22 août 2010Date d'inscription ContributeurStatut 8 février 2017 Dernière intervention - 14 janv. 2017 à 20:13
Et la longueur de la chaine ?
Répondre
victor1507 31Messages postés lundi 15 février 2016Date d'inscription 23 janvier 2017 Dernière intervention - 14 janv. 2017 à 23:26
Bon alors j'ai vérifié plein de choses dans le programme et j'ai découvert que lorsque je cryptais un fichier, le premier bit n'est pas pris en compte lors de l'écriture dans le fichier... Mais je pense avoir réussi à contrer le problème en ajoutant un 0 au début de la variable textebin de la fonction
uncrypt()
. Mais en partant du principe que le premier bit est un 0, je ne sais pas si le fichier sera toujours valide si le premier était en réalité un 1... Qu'en penses-tu ?
Répondre
dsy73 8904Messages postés dimanche 22 août 2010Date d'inscription ContributeurStatut 8 février 2017 Dernière intervention - 15 janv. 2017 à 10:25
Ajouter un bit n'est pas la solution.
Je n'ai pas lu ton code en détails mais il me semble que tu utilises des fonctions de conversion hexa et binaire sans tenir compte de la longueur de la chaine, cela ne peut pas fonctionner.
Lis la doc correspondant à ces fonctions pour comprendre leur fonctionnement.
Répondre
victor1507 31Messages postés lundi 15 février 2016Date d'inscription 23 janvier 2017 Dernière intervention - 15 janv. 2017 à 10:32
C'est a dire ? Qu'est ce que tu veux dire par "la longueur de la chaîne" ? Pour ma part sa marche impec en ajoutant un bit si je considere que le bit en question est un 0, mais je voudrais savoir si le fait qu'un des bits soit potentiellement corrompu va empêcher la lecture du fichier.

Je vais faire quelques tests de mon côté et je reviens un peu plus tard
Répondre
Donnez votre avis
Utile
+0
moins plus
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)
victor1507 31Messages postés lundi 15 février 2016Date d'inscription 23 janvier 2017 Dernière intervention - 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
Répondre
jisisv 3662Messages postés dimanche 18 mars 2001Date d'inscription ModérateurStatut 15 janvier 2017 Dernière intervention - 8 janv. 2017 à 02:24
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.
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !