Page 1 sur 1
prebleme d'ecriture dans un fichier
Publié : sam. 12/mai/2007 21:26
par scaraber
Salut,
J'ai un petit probleme j'ai essayer de faire un systemede cryptage de fichier. je lit chaque octel un par un (ReadByte) que je réécris avec un (WriteByte) sauf que le probleme c'est que quand jouvre ensuite le fichier ecris en texte sous notepad, avec le notepad sa me met des carré, les byte sont bien ecris (bon identifiant de la lettre) mais sa l'affiche mal?
Quelqu'un connait-il un moyen de modifier les octe d'un fichier sans les probelem que je rencontre . ...
a+
scaraber
Re: prebleme d'ecriture dans un fichier
Publié : sam. 12/mai/2007 22:32
par Backup
scaraber a écrit :Salut,
J'ai un petit probleme j'ai essayer de faire un systemede cryptage de fichier. je lit chaque octel un par un (ReadByte) que je réécris avec un (WriteByte) sauf que le probleme c'est que quand jouvre ensuite le fichier ecris en texte sous notepad, avec le notepad sa me met des carré, les byte sont bien ecris (bon identifiant de la lettre) mais sa l'affiche mal?
Quelqu'un connait-il un moyen de modifier les octe d'un fichier sans les probelem que je rencontre . ...
a+
scaraber
donne ton code !!

comment veut tu que l'on voit ou le code merdoie, si on ne le vois pas ?
a tu essayé de charger le resultat de ton algorythme de criptage avec un editeur Hexa , pour savoir ce que ton prg sort ?
si les codes hexa du fichier en sortie sont inferieur a 32 ou superieur a 127, tu aura des problemes !!
N'oublie pas qu'en purebasic un octet va de -128 à +127 !!
et pas de 0 a 255 !

il te faudra faire un
Publié : sam. 12/mai/2007 22:43
par scaraber
Encrypteur:
Code : Tout sélectionner
Fichier$=OpenFileRequester("Choissisez un fichier a crypter","","",0)
OpenFile(0,Fichier$)
OpenFile(1,Fichier$+".crypt")
Dim Datas.b(2048)
Cle=Random(6)
While Eof(0)=0
Byte=ReadByte(0)
Byte=Byte+Cle*ByteID
While Byte>127
Byte-255
Wend
Datas(ByteID)=Byte
ByteID+1
Wend
WriteByte(1,Cle)
While ByteID>0
WriteByte(1,Datas(ByteID))
ByteID-1
Wend
CloseFile(0)
CloseFile(1)
MessageRequester("Fichier Crypter","Complete")
Decrypteur:
Code : Tout sélectionner
Fichier$=OpenFileRequester("Choissisez un fichier a decrypter","","",0)
OpenFile(0,Fichier$)
OpenFile(1,Left(Fichier$,Len(Fichier$)-5))
Dim Datas.b(2048)
Cle=ReadByte(0)
ByteID=Lof(0)-1
While Eof(0)=0
Byte=ReadByte(0)
Byte=Byte-Cle*ByteID
While Byte<-128
Byte+255
Wend
Datas(ByteID)=Byte
ByteID-1
Wend
While ByteID<Lof(0)-1
WriteByte(1,Datas(ByteID))
ByteID+1
Wend
CloseFile(0)
CloseFile(1)
MessageRequester("Fichier Crypter","Complete")
Publié : sam. 12/mai/2007 22:56
par Backup
ton problem viens de ça :(dans l'encrypteur)
tu test si c'est superieur a 127 , mais que ce passe t'il si c'est inferieur a 0 ??
essaie de tracer ton prg pas a pas en lui faisant lire un fichier txt
avec ecris dedans cette phrase :
ceci est un essai
tu verra le probleme a partir du "e" de "est" !!

Publié : sam. 12/mai/2007 22:59
par scaraber
je par du principe que mon cryptage augmente la valeur de l'octet et que un byte va de -128 a +127 donc si on ne peu etre que au dessus
Publié : dim. 13/mai/2007 0:09
par Backup
scaraber a écrit :je par du principe que mon cryptage augmente la valeur de l'octet et que un byte va de -128 a +127 donc si on ne peu etre que au dessus
c'est quand meme domage que tu n'ecoute pas ce que je te dit !
voici la preuve par l'image que tu obtient dans certain cas des chiffres négatif !!
regarde bien la variable "Byte" elle est egale a -110 !!! sur la lettre "s"
dans ce cas ton While Byte>127 ne sert a rien !!
et c'est bien un chiffre négatif qui va etre ecrit en sortie !!
la lettre "s" a le code 115
le ByteID est egale a 6
Cle est egale a 5
et ta formule donne
Byte=Byte+Cle*ByteID
soit : 115+(5*6)=145
byte =145 , seulement ton byte est un .b , IL NE PEUT DEPASSER 127
voila pourquoi tu as un chiffre négatif !!
Publié : dim. 13/mai/2007 9:11
par scaraber
j'ai regarder ce que tu as dit mais j'ai juste expliquer pourquoi javait mis superieur a 127 et pas inferieur, j'etait crever hier soir, j'ai pas eu le temps de tester
Edit
et c'est bien un chiffre négatif qui va etre ecrit en sortie !! Confused
purebasic lit bien aussi en negatif, donc on peu en theorie ecrire en negartif ... Si purebasic lit -20, que jele cryptage le modifie et donne 50 puis redonne -20 je ne voit pas ou est l e probleme ... ?, je passserais la variable Byte en long, pour tester si sa marche mieux
Publié : dim. 13/mai/2007 10:02
par Backup
scaraber a écrit :
purebasic lit bien aussi en negatif, donc on peu en theorie ecrire en negartif ... Si purebasic lit -20, que jele cryptage le modifie et donne 50 puis redonne -20 je ne voit pas ou est l e probleme ... ?, je passserais la variable Byte en long, pour tester si sa marche mieux
oui purebasic ecrit du négatif !!

le probleme c'est qu'en principe dans mon exemple , il ecrit -110
alors qu'il aurai du ecrire 145 !! ce n'est pas vraiment pareille voit tu

Publié : dim. 13/mai/2007 12:50
par scaraber
bha meme si on met un nombre negatif lors du cryptage, le decryptage fait l'inverse ... non ?
Publié : dim. 13/mai/2007 14:55
par brossden
Si je peux te donner un truc Scaraber évite de faire trop de ReadByte et Write Byte, chaque instruction fait (en théorie) un accès disque.
Deux problèmes à cela:
- le disque est un perifphérique mécanique qui s'use et mieux vaut économiser un organe qui s'il tombe en panne ....
- chaque accès disque est beaucoup plus long qu'un accès mémoire et si tu traites des fichiers longs tu vas sentir que le temps de réponse devient catastrophique.
Si tu veux mon avis, et je pense qu'ici peu de monde me contradira, préfère les accès mémoire.
Pour être plus clair
Tu demande à Pure Basic de réserver une place mémoire aussi importante que la taille du fichier que tiu veux traiter et tu y places tous les caractères en une seule fois :
Code : Tout sélectionner
OpenFile(1,"Monfichier")
*Mem = AllocateMemory(Lof(1))
ReadData(*Mem,Lof(1))
CloseFile(1)
Puis tu lis chaque caractère de cet espace mémoire par la fonction PeekC(*Mem + postion du caractère ( 0 étant le premier 1 le second ...), tu modifies à comme tu l'entends ce caractère puis tu le remet à la plce du caractère initial avec la fonction inverse à la lescture PokeC(*Mem + postion du caractère) , tu lis le suivant ...
Code : Tout sélectionner
For n = 0 to Lof(1)-1
Byte = PeekC(*Mem+n)
;ici le traitement pour modifier ton caractère
PokeC(*Mem+n,Byte)
Next
Puis tu ecris en une seule fois les caractères modifiés qui sont en mémoire par la fonction WriteData(..)
Code : Tout sélectionner
OpenFile(1,"MonCrypte")
WriteData(1,*Mem,Lof(1))
CloseFile(1)
Teste sur un fichier d'un MegaOctet ou plus si tu veux tu veras que c'est presque instantané ! (et tout ceci pour deux accès disque au lieu de ... deux fois plus que de caractères à lire puis écrire !
Publié : dim. 13/mai/2007 14:57
par scaraber
Ok je te remercie je vais regarder sa