|
[WinDev 19] Pb avec Crypte/Decrypte + compression de chaîne |
Débuté par Laurent.C, 07 avr. 2014 12:35 - 10 réponses |
| |
| | | |
|
| |
Posté le 07 avril 2014 - 12:35 |
Bonjour,
pardonnez mes erreurs s'il y en a car je débute avec Windev merci.
Pour mon projet j'écris dans un fichier .ini (renommé en .dll) l'ensemble des chemins dont j'ai besoin pour mes .fic et autres...
J'utilise également un crypte/decrypte.
Principe de base : 1. Sur clic d'un bouton : je prends la chaîne contenu dans 5 champs de saisie et je vais les écrire dans un fichier de manière cryptée. 2. Sur clic d'un bouton ou en fin d'initialisation de ma fenêtre de démarrage j'exécute une procédure qui va décrypter et lire mon fichier et ramener cette chaîne dans mes champs de saisie.
Le souci rencontré est que pour certains chemins(arborescence parfois assez longue) je me retrouve avec des chaînes de caractères de plus de 60 positions ce qui a pour effet de transformer ma chaîne en symbole que ne sait plus interpréter Windev au moment de réintégrer cette chaîne.
Déjà premières questions : Est-ce normal cette limitation à 60 caractères? Y a t'il volontairement une limite? Peut-on la modifier?
Ayant vu cette limitation j'ai pensé à compresser la chaîne dont voici un extrait ci-dessous
code pour le crypte que je passe sur le bouton 1.(je ne donne ici qu'une ligne à titre d'exemple mais elle sont toutes identiques, seule le nom des variables change)
var_donnees=Crypte(SC_SelecteurRépertoire_FIC.SAI_REP,Cle,compresseLZW,encodeAucun) INIEcrit("sgbd","fic_donnees",var_donnees,Onglet1.SC_SelecteurFichier_param.SAI_FIC)
de cette manière j'ai un fichier qui ressemble à ça :
Puis ensuite le code pour le decrypte à l'ouverture de la fenêtre de démarrage et/ou sur clic d'un bouton
SC_SelecteurRépertoire_FIC.SAI_REP=Décrypte(INILit("sgbd","fic_donnees","",SC_SelecteurFichier_param.SAI_FIC),Cle,compresseLZW,encodeAucun)
Le problème que j'ai c'est que mon decrypte ne remonte rien dans mes champs de saisie. A croire qu'il ne sait pas décompresser ou lire je ne comprends pas. J'ai parcouru différents posts qui parlaient de problème de decrypte mais rien trouvé qui correspond à celui ci.
Merci de votre aide. |
| |
| |
| | | |
|
| | |
| |
Posté le 07 avril 2014 - 13:44 |
Bonjour Laurent
ayant utilisé crypte et décrypte dans pas mal de cas, je peux te dire qu'il n'y a pas de limite à 60 caractères...
Par contre, le résultat de crypte contient en génral des caractères binaires qui ne peuvent pas être stockés tel quel dans un fichier ini (texte)... Comme par exemple le caractère de fin de chaine
Donc, il faut faire CRYPTE suive d'un encodage en texte (par exemple par URLENCODE ou équivalent) et l'inverse à la lecture
de cette manière, tu transforme le résultat binaire de crypte en chaine pour le stockage
Cordialement
-- Fabrice Harari Consultant WinDev, WebDev et WinDev Mobile International NOUVEAU: WXShowroom.com est disponible : Montrez vos projets ! Plus d'information sur http://fabriceharari.com
On 4/7/2014 4:35 AM, Laurent.C wrote:
Bonjour, pardonnez mes erreurs s'il y en a car je débute avec Windev merci. Pour mon projet j'écris dans un fichier .ini (renommé en .dll) l'ensemble des chemins dont j'ai besoin pour mes .fic et autres... J'utilise également un crypte/decrypte. Principe de base : 1. Sur clic d'un bouton : je prends la chaîne contenu dans 5 champs de saisie et je vais les écrire dans un fichier de manière cryptée. 2. Sur clic d'un bouton ou en fin d'initialisation de ma fenêtre de démarrage j'exécute une procédure qui va décrypter et lire mon fichier et ramener cette chaîne dans mes champs de saisie. Le souci rencontré est que pour certains chemins(arborescence parfois assez longue) je me retrouve avec des chaînes de caractères de plus de 60 positions ce qui a pour effet de transformer ma chaîne en symbole que ne sait plus interpréter Windev au moment de réintégrer cette chaîne. Déjà premières questions : Est-ce normal cette limitation à 60 caractères? Y a t'il volontairement une limite? Peut-on la modifier? Ayant vu cette limitation j'ai pensé à compresser la chaîne dont voici un extrait ci-dessous code pour le crypte que je passe sur le bouton 1.(je ne donne ici qu'une ligne à titre d'exemple mais elle sont toutes identiques, seule le nom des variables change) var_donnees=Crypte(SC_SelecteurRépertoire_FIC.SAI_REP,Cle,compresseLZW,encodeAucun)
INIEcrit("sgbd","fic_donnees",var_donnees,Onglet1.SC_SelecteurFichier_param.SAI_FIC) de cette manière j'ai un fichier qui ressemble à ça :
Puis ensuite le code pour le decrypte à l'ouverture de la fenêtre de démarrage et/ou sur clic d'un bouton SC_SelecteurRépertoire_FIC.SAI_REP=Décrypte(INILit("sgbd","fic_donnees","",SC_SelecteurFichier_param.SAI_FIC),Cle,compresseLZW,encodeAucun) Le problème que j'ai c'est que mon decrypte ne remonte rien dans mes champs de saisie. A croire qu'il ne sait pas décompresser ou lire je ne comprends pas. J'ai parcouru différents posts qui parlaient de problème de decrypte mais rien trouvé qui correspond à celui ci. Merci de votre aide. |
| |
| |
| | | |
|
| | |
| |
Posté le 07 avril 2014 - 14:30 |
Bonjour,
Tu pars sur de mauvaises bases. Vu de l'extérieur, ton problème est un problème simple. Tu dois donc te dire qu'il y a une solution simple à ce problème.
Si Windev obligeait les informaticiens à compresser les chaines de caractères pour qu'elles fassent moins de 60 caractères, alors PCSoft aurait fermé boutique depuis longtemps.
Il ne faut pas bâtir une usine à gaz pour solutionner une question simple, et c'est ce que tu es en train de faire.
Tu as un champ de saisie dans lequel tu stockes un nom de répertoire, ou un nom de fichier. Ce champ de saisie DOIT te renvoyer ce que tu as écrit. Point final. Il n'y a pas à tergiverser là dessus.
Et il faut comprendre pourquoi ton champ de saisie transforme la chaîne saisie. Dans les paramètres de ton champ de saisie (onglet Détail ou onglet Général) , il n'y aurait pas des trucs cochés, qui ne devraient pas l'être ? Ta chaîne 'bizarre' elle ne se finirait pas par ~1 par hasard ? Et dans ce cas, je regarderais du côté de fcheminlong() ou fchemincourt() ...
La suite de ton problème ( inilit qui ne renvoie pas ce que tu as écrit ) ... ça se résoudra certainement quand tu reviendras à ton plan de départ : écrire le nom de ficher tel quel, et sans passer par une compression/cryptage. |
| |
| |
| | | |
|
| | |
| |
Posté le 07 avril 2014 - 17:22 |
J'ai fait l'essai Xfois.
Si j'ai un chemin court que je crypte ex : D:\MonProjet\MesFichiers.xxx tout va bien Dès qu'il dépasse 60 caractères ça ne fonctionne plus.
J'ajoute que ce programme a initialement été développé en WD18 et que je l'ai repassé en 19. (Aucun problème) Je ne suis pas dans la possibilité de tester avec une version 18 pour voir si j'ai le même problème. Il n'y a pas d'espace dans ma chaîne.
Dans la description de mes champs de saisie,
Type = Texte Masque de saisie = Nom et Chemin complet d'un fichier Taille de saisie = Il bloque à 260 caractères, même si je mets 0 il accepte la validation, mais quand j'y retourne il me remet 260 caractères. Assister la saisie de chemin de fichier = est coché
Je ne sais pas quoi vous donner d'autre comme indication. |
| |
| |
| | | |
|
| | |
| |
Posté le 07 avril 2014 - 19:23 |
Soyons clair.
Windev limite la taille de saisie à 260 caractères ? OUI, normal. cf par exemple : http://support.microsoft.com/kb/148754/fr Si vous voulez dépasser cette limite de 260 caractères, paramétrez le champ de saisie comme une chaîne de caractères quelconque, et non comme un nom de fichier. Et dans un 2nd temps, vous pourrez ajouter un bouton à coté pour aider l'utilisateur à saisir le nom de fichier ( cf fonction fselecteur ...mais fselecteur aussi tronque à 260 caractères)
Windev plante si le chemin du fichier fait plus de 60 caractères ? NON. Faites le test tout simple, avec un bouton et le code : Info(saisie1, taille(saisie1)) Je viens de créer un champ de saisie avec les mêmes propriétés que ce que vous dites, et Windev accepte plus de 60 caractères, sans déformer du tout le nom du fichier que je saisis. Mais pas plus de 260 caractères , effectivement.
Dans tous les cas, l'idée était mauvaise. Tu avais un nom de fichier faux ou tronqué. Tu repartais de ce nom de fichier faux, tu compressais cette chaîne ... tu décompressais, et tu espérais retrouver la chaîne correcte.
Non. après compression / décompression, tu retrouveras au mieux la chaîne fausse d'origine, et rien de plus.
Et en l'occurrence, Inilit / Iniécrit savent traiter des chaines relativement longues ... tant que ces chaines ne contiennent pas des caractères 'exotiques' ( caractère FinDeLigne ou FinDeFichier en particulier) En cryptant/Compressant le nom de fichier, j'imagine que tu te retrouves avec des caractères complètement incompatibles avec IniEcrit.
Souvent, quand ils ont un bug, les développeurs AJOUTENT des lignes de code pour corriger le bug. NON ! Quand il y a un bug, la solution, c'est généralement d'enlever des lignes de codes, et pas d'en rajouter.
Avec la compression, tu as ajouté un 2ème bug, tu n'as pas corrigé le premier bug. |
| |
| |
| | | |
|
| | |
| |
Posté le 08 avril 2014 - 09:06 |
Fais ton crypte avec les arguments ci-dessous, tu n'auras pas de problème dans un fichier INI, tous les caractères seront reconnus : Crypte(<Chaine>,<Mot de passe>,crypteSécurisé,encodePCS) |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages |
|
Posté le 18 juin 2014 - 19:13 |
Bonjour, Qu'est-ce que ça fait plaisir ... je lutte depuis plusieurs jours avec exactement le même pb. Je suppose que je souhaitais faire comme Laurent C, à savoir stocker dans un fichier INI des chaines cryptées .... et j'allais laisser tomber jusqu'à ce je lise son post ....
Je confirme donc ce pb et la limite des 60 caractères (je suis avec WD14)
Voici ma fonction de cryptage : PROCEDURE MonCrypte(Chn)
Chn1 est une chaîne=Crypte(Chn,"MonMotdePasse",crypteRapide,encodePCS) //elle est pleine de caractères bizarres Chn2 est une chaîne="" POUR i=1 _A_ Taille(Chn1) Chn2+=NumériqueVersChaîne(Asc(Chn1[[i]]),"X") FIN RENVOYER Chn2
//j'ai souhaité prendre chaque caractère de la chaine et le transformer en hexadécimal pour être sûr d'obtenir une chaine (de caractères numériques) qui puisse s'écrire dans un fichier INI
et ma fonction de décryptage PROCEDURE MonDecrypte(chn) Chn2 est une chaîne="" POUR i=1 _A_ Taille(chn)/2 Chn2+=Caract(Val(chn[[2*i-1 A 2*i]],"x")) FIN RENVOYER Décrypte(Chn2, "MonMotdePasse",crypteRapide,encodePCS)
Si quelqu'un détecte le pb, je lui serais très reconnaissant ! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages |
|
Posté le 18 juin 2014 - 19:19 |
@Rémi B : Je confirme que le résultat de la fonction Crypte avec les paramètres "CrypteSécurisé,encodePCS" peut amener une chaine que l'on ne peut écrire en l'état dans un fichier INI. Ou plutôt que cette chaine ne pourra pas être relue par un INIlit
@Joel : Ok pour cette limite des 260 caractères mais même en y prenant garde, le pb se pose bien avant puisque c'est au 60 ième caractère
@Laurent. C : Je concatène 7 chaines pour obtenir la chaine à crypter. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages |
|
Posté le 18 juin 2014 - 19:27 |
@Fabrice H : Yes ! ta solution est une bonne solution !! |
| |
| |
| | | |
|
| | |
| |
Posté le 19 juin 2014 - 03:11 |
Bonjour Michel
stocker le résultat de la fonction crypte dans une chaine, c'est chercher les ennuis, étant donné que ce résultat est BINAIRE. Il faut le stocker dans un buffer... De la, tu devrais pouvoir faire ta transfo en hexa (buffervershexa) facilement
Cordialement
-- Fabrice Harari Consultant WinDev, WebDev et WinDev Mobile International
NOUVEAU: WXShowroom.com est disponible : Montrez vos projets ! Plus d'information sur http://fabriceharari.com
On 6/18/2014 11:13 AM, MichelD wrote:
Bonjour, Qu'est-ce que ça fait plaisir ... je lutte depuis plusieurs jours avec exactement le même pb. Je suppose que je souhaitais faire comme Laurent C, à savoir stocker dans un fichier INI des chaines cryptées .... et j'allais laisser tomber jusqu'à ce je lise son post .... Je confirme donc ce pb et la limite des 60 caractères (je suis avec WD14)
Voici ma fonction de cryptage : PROCEDURE MonCrypte(Chn)
Chn1 est une chaîne=Crypte(Chn,"MonMotdePasse",crypteRapide,encodePCS) //elle est pleine de caractères bizarres Chn2 est une chaîne="" POUR i=1 _A_ Taille(Chn1) Chn2+=NumériqueVersChaîne(Asc(Chn1[[i]]),"X") FIN RENVOYER Chn2
//j'ai souhaité prendre chaque caractère de la chaine et le transformer en hexadécimal pour être sûr d'obtenir une chaine (de caractères numériques) qui puisse s'écrire dans un fichier INI et ma fonction de décryptage PROCEDURE MonDecrypte(chn) Chn2 est une chaîne="" POUR i=1 _A_ Taille(chn)/2 Chn2+=Caract(Val(chn[[2*i-1 A 2*i]],"x")) FIN RENVOYER Décrypte(Chn2, "MonMotdePasse",crypteRapide,encodePCS)
Si quelqu'un détecte le pb, je lui serais très reconnaissant ! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages |
|
Posté le 25 juin 2014 - 10:50 |
C'est bien noté, merci. Michel |
| |
| |
| | | |
|
| | | | |
| | |
|