IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Encodage / Décodage ROT13


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut Encodage / Décodage ROT13
    Bonjour,
    Je souhaite encoder une chaine de caractère, passer en argument, en ROT13.
    Et encoder un fichier.txt, passer en argument et sauvegarder le resultat dans fichier.rot13

    Je crois qu'il est possible d'utiliser l'API Win32, GIT et CMAKE mais je ne sais pas le faire.
    J'ai fait 2 programmes mais j'aimerai bien faire un choix
    1 - Chiffre
    2 - Dechiffre

    Voici ce que j'ai fait, avec beaucoup de difficulté.
    Pouvez-vous m'aider pour la seconde partie, à savoir, quand c'est un fichier.txt qui est passé en argument.

    Merci

    CHIFFRAGE

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char** argv)
    {
        char* MotACoder = argv[1];	
    	int key = 13;
     
        // Toutes les lettres du Mot à Coder
     
        for (int n = 0, len = strlen(MotACoder); n < len; n++)
        {
            int currentLetter = MotACoder[n];
     
            char cipher = currentLetter + key;
     
            // On vérifie que la lettre suivant ne dépassera pas 26
    		// Ou n'est pas une lettre ASCII
    		// Si c'est le cas, on applique %26 pour revenir dans le groupe de lettre
     
            if ((currentLetter - 'a') + key > 26)
            {
                key = (currentLetter - 'a') + key) % 26;
                cipher = 'a' + key;
            }
     
    		// On affiche le codage
            printf("%c", cipher);
     
            // On remet Key à 13
    		// On passe à la lettre suivante
            key = 13;
            }
        }
        printf("\n");
        return 0;
    }

    DÉCHIFFRAGE

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char** argv)
    {
        char* MotACoder = argv[1];	
    	int KeyRot13 = -13;
     
        // Toutes les lettres du Mot à Décoder
     
        for (int n = 0, len = strlen(MotACoder); n < len; n++)
        {
            int LettreActuelle = MotACoder[n];
     
            char LettreDechiffre = LettreActuelle - KeyRot13;
     
            // On vérifie que la lettre suivant ne dépassera pas 26
    		// Ou n'est pas une lettre ASCII
    		// Si c'est le cas, on applique %26 pour revenir dans le groupe de lettre
     
            if ((LettreActuelle - 'a') - KeyRot13 > 26)
            {
                KeyRot13 = (LettreActuelle - 'a') - KeyRot13) % 26;
                LettreDechiffre = 'a' + KeyRot13;
            }
     
    		// On affiche le codage
            printf("%c", LettreDechiffre);
     
            // On remet KeyRot13 à -13
    		// On passe à la lettre suivante
            KeyRot13 = -13;
            }
        }
        printf("\n");
        return 0;
    }

  2. #2
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    Salut.
    Je pense que tu n'as pas dû faire beaucoup tourner ton code car il est bourré de faute ....
    voici le chiffrage après compilation réussie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char** argv)
    {
        char* MotACoder = argv[1];
        int key = 13;
     
        // Toutes les lettres du Mot à Coder
     
        for (int n = 0, len = strlen(MotACoder); n < len; n++)
        {
            int currentLetter = MotACoder[n];
     
            char cipher = currentLetter + key;
     
            // On vérifie que la lettre suivant ne dépassera pas 26
            // Ou n'est pas une lettre ASCII
            // Si c'est le cas, on applique %26 pour revenir dans le groupe de lettre
     
            if ((currentLetter - 'a') + key > 26)
            {
                key = ((currentLetter - 'a') + key) % 26;
                cipher = 'a' + key;
            }
     
            // On affiche le codage
            printf("%c", cipher);
     
            // On remet Key à 13
            // On passe à la lettre suivante
            key = 13;
        }
     
    printf("\n");
    return 0;
    }
    Essaies de t'appliquer pour le reste !

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Citation Envoyé par exe2bin Voir le message
    Salut.
    Je pense que tu n'as pas dû faire beaucoup tourner ton code car il est bourré de faute ....
    voici le chiffrage après compilation réussie :
    Bonjour et merci pour la réponse.
    Effectivement, je n'avais pas compilé...

    Je viens de copier / coller le code que tu as déposé et ça m'indique un warning.

    Le programme s'arrête à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int n = 0, len = strlen(MotACoder); n < len; n++)
    "conversion de size_t en int perte possible de données"

    Je crois que c'est parce que je travaille avec un Windows 64bits.
    J'ai tenté de désactiver la vérification de portabilité 64bits mais je n'ai pas trouvé l'option.

  4. #4
    Membre éclairé
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Billets dans le blog
    3
    Par défaut
    En fait, le type size_t est le type renvoyé par strlen() donc tu peux déclarer :
    afin de rester cohérent et faire taire le compilateur

  5. #5
    Membre actif Avatar de leresidue
    Homme Profil pro
    Hobbyiste
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Hobbyiste
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Par défaut
    Le problème me semble être la variable MotACoder. Si le programme ne reçoit pas d'arguments, argv[1] sera NULL.

    Une solution, c'est de s'assurer que MotACoder pointe vers une chaîne de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
     
    char* MotACoder = argv[1];
    int key = 13;
    unsigned int n;
     
    if(MotACoder == 0) {
    	MotACoder = "test";
    }
    size_t len = strlen(MotACoder);
     
    ...
    La convention c'est que lorsqu'un pointeur pointe vers l'adresse 0x00000000, ce pointeur est invalide. Pour aider à appliquer cette convention, les systèmes d'exploitations font en sorte que la première page de mémoire vive de chaque programme, pointe vers une page invalide. Ça permet à l'OS de recevoir un événement de la part du processeur, qui lui permet ensuite d'arrêter le programme fautif. Pour plus d'informations sur la pagination: https://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pupucecd Voir le message
    Donc je fais un case(choix) 1 - Codage, 2 - Décodage
    C'est le principe de la modularité. Si je te donne un jeu de constructions qui contient une maison, et que je te demande de faire une maison, tu n'auras aucun souci. Mais si ensuite je te demande de faire un bateau...
    Si à la place je te donne un jeu qui contient plein de petites pièces (fenêtre, porte, tuile, etc) et que je te demande de faire une maison, tu pourras alors les arranger d'une certaine manière pour avoir une maison. Si ensuite je veux un baeau, tu pourras les arranger d'une autre façon et avoir au final un bateau.


    Citation Envoyé par pupucecd Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char cipher = currentLetter + key;
    if ((currentLetter - 'a') + key > 26) {
    	key = ((currentLetter - 'a') + key) % 26;
    	cipher = 'a' + key;
    }
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cipher=current_letter + key;
    if (cipher > 'z') cipher=cipher - 26;

    Et une fonction plus généraliste
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char lettreC(char lettre, unsigned short key, char inf, char sup) {
    	char cipher = lettre + key;
    	if (cipher > sup) cipher=cipher - sup + inf - 1;
    	return cipher;
    }

    Et on l'appelle (par exemple) de cette façon: lettreC('f', 22, 'a', 'z'). Normalement (parce que non testé) ça devrait renvoyer 'b'...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    bonjour et merci pour votre aide.
    j'avance doucement mais je comprends mieux "ce que je fais"...
    pour le moment, je me contente de prendre des codes existants, de les compiler et de comprendre ce qu'il ce passe.

    J'ai remarqué que beaucoup de code, pour le ROT13 utilise char cipher ...
    Il y a une convention avec ce "cypher" ou c'est juste que tout le monde utilise ce nom de variable ?

    Encore merci

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pupucecd Voir le message
    Pouvez-vous m'aider pour la seconde partie, à savoir, quand c'est un fichier.txt qui est passé en argument.
    Bonjour

    Reprend ton programme mais transfère tes parties "chiffrement/déchiffrement" dans des fonctions dédiées (donc en dehors du main()). Comme ça, tu pourras les appeler quand tu veux.
    Ensuite, te suffit d'écrire une fonction qui lit le fichier et, pour chaque ligne lue, appelle la fonction de chiffrement, récupère son résultat et l'écrit dans un second fichier.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    OK Merci.
    Donc je fais un case(choix) 1 - Codage, 2 - Décodage
    Et en fonction du résultat j'exécute l'un ou l'autre des fonctions


    Modifications faites.
    Quand je compile, aucune erreur mais quand je lance, le programme bug

    Exception levée à 0x0FB9D6F0 (ucrtbased.dll) dans rot13.exe*: 0xC0000005*: Violation d'accès lors de la lecture de l'emplacement 0x00000000.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char** argv)
    {
    	char* MotACoder = argv[1];
    	int key = 13;
    	unsigned int n;
    	size_t len = strlen(MotACoder);
    
    	// Toutes les lettres du Mot à Coder
    
    	for (n=0; n<len; n++)
    	{
    		int currentLetter = MotACoder[n];
    
    		char cipher = currentLetter + key;
    
    		// On vérifie que la lettre suivant ne dépassera pas 26
    		// Ou n'est pas une lettre ASCII
    		// Si c'est le cas, on applique %26 pour revenir dans le groupe de lettre
    
    		if ((currentLetter - 'a') + key > 26)
    		{
    			key = ((currentLetter - 'a') + key) % 26;
    			cipher = 'a' + key;
    		}
    
    		// On affiche le codage
    		printf("%c", cipher);
    
    		// On remet Key à 13
    		// On passe à la lettre suivante
    		key = 13;
    	}
    
    	printf("\n");
    	return 0;
    }

Discussions similaires

  1. UrlEncode / UrlDecode: mauvais encodage décodage?
    Par DarkHerumor dans le forum ASP.NET
    Réponses: 15
    Dernier message: 06/07/2009, 19h09
  2. [Recherche bibliothèque] Encodage/décodage d'url
    Par Trunks dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 16/06/2009, 10h35
  3. Encodage / Décodage AAC en Java
    Par Reeter dans le forum Multimédia
    Réponses: 0
    Dernier message: 02/04/2009, 13h28
  4. Encodage & Décodage de fichier AMF avec java
    Par Kadran dans le forum Persistance des données
    Réponses: 1
    Dernier message: 04/03/2009, 12h24
  5. problème d'encodage décodage
    Par dj.motte dans le forum Général Python
    Réponses: 2
    Dernier message: 13/10/2008, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo