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 :

XOR de 4 char* contenant des bits en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut XOR de 4 char* contenant des bits en C
    Bonjour,
    Je sais que la question à été posée plein de fois mais je ne vois pas comment faire. Ma question est pour du C uniquement, je précise car dans d'autre langage on trouve pleins de fonctions

    J'ai ce bout de code qui normalement fonctionne mais je n'arrive pas à l'adapter à mes besoins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //XOR TEST
    char tab1[] = "01001110010100110110";
    char tab2[] = "10110110011000110011";
    //    XORed =  11111000001100000101
     
    char tab3[21];
    int tailleTab1 = sizeof(tab1) -1;
    int tailleTab2 = sizeof(tab2) -1;
    int i;
     
    for (i=0; i< tailleTab1; i++){
    tab3[i] = tab1[i]^tab2[i];
    printf("%d", tab3[i]);
    }

    Dans mon cas, je veux faire le Checksum de 4 char* contenant des 0 et des 1. Le premier char* fait 60bits, le deuxième 20 bits, le troisième 16 bits et le dernier 4 bits.

    Je ne sais pas trop comment faire, j'ai essayé de mettre ce code dans une fonction (funXor()) avec en paramètre 2 de mes 4 char mais j'ai soit rien en sortie, soit des erreurs de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Xor Function
    char *funXor(char *tab1, char *tab2, int tail)
    {
    char tab3[tail];
    int i;
    int tailleTab1 = sizeof(tab1) -1;
     
    	for (i=0; i< tailleTab1; i++){
    	tab3[i] = tab1[i]^tab2[i];
    	//printf("%d", tab3[i]);
    	}
    	return tab3;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *xor0 = funXor(JK,JN3, 80); 
    char *xor1 = funXor(xor0,JA3, 96); 
    char *xor2 = funXor(xor1,JC3, 100);
    printf("xor2:%s/", xor2);

    C'est si compliqué de faire le XOR de 4 char* contenant des bits? Je vous remercie de votre aide, je fait rarement du C d'où mon problème assez basique...


    Sinon j'ai convertis ces 4 chars* en Hexadécimal pour faire un XOR mais je n'arrive pas non plus à faire quelque chose qui fonctionne...


    Si vous avez une idée n'hésitez pas, je suis un peu perdu...

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Bonsoir,

    Réponse rapide :
    Essaie de remplacer tab3[i] = tab1[i]^tab2[i]; par tab3[i] = (tab1[i]^tab2[i]) | '0';

    Réponse détaillée :
    Lorsque tu écris "01001110010100110110", c'est une chaîne de caractères que tu définis. Celle-ci contient donc en fait les codes ASCII des caractères « 0 » et « 1 », soit respectivement 30h et 31h en hexadécimal, et donc 00110000b et 00110001b en binaire. Si tu fais un OU exclusif entre ces deux valeurs, leurs bits communs s'annulent et tu te retrouves avec 00h et 01h au lieu de 30h et 31h. Ce sont donc des caractères non affichables.

    À noter que le C est fait pour manipuler directement les bits d'un entier en mémoire. Il n'y a pas, à ma connaissance, de manière de spécifier directement les constantes littérales en binaire, mais tu peux le faire en hexadécimal.

    Ainsi, l'équivalent de ton programme serait :

    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
    #include <stdio.h>
     
    int main (void)
    {
        unsigned long int t1 = 0x4E536;
        unsigned long int t2 = 0xB6633;
        unsigned long int t3 = 0;
     
        t3 = t1 ^ t2;
     
        printf ("t1 : %x\n",t1);
        printf ("t2 : %x\n",t2);
        printf ("t3 : %x\n",t3);
     
        return 0;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut
    En partant du principe que je fasse le XOR avec les valeurs en Hexa, j'ai un problème de type car les variables qui contiennent mes valeurs hexadecimales sont des char* du coup j'ai cette erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     invalid operands to binary ^ (have ‘char *’ andchar *’)
    comment puis-je changer le type de mon char* contenant quelque chose comme "0xC6" en un unsigned long int ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Regarde du côté de strtol().
    Bon courage.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas, à ma connaissance, de manière de spécifier directement les constantes littérales en binaire
    Si tu parles de constantes qui s'écriraient ainsi int a = 0b01101001; par exemple, alors "oui", ça n'existe pas de manière standard. Tu le rencontres souvent pour les compilos pour micro-contrôleurs car les bits sont très utilisés, mais cela reste de extensions de la norme. GCC est malin et possède lui aussi une telle extension

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut
    Merci beaucoup Obsidian ça fonctionne nickel !
    Merci d'avoir pris du temps pour m'expliquer, tu m'as énormément aidé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. StringBuffer contenant des entier et des char!
    Par ranell dans le forum Langage
    Réponses: 23
    Dernier message: 08/03/2007, 05h52
  2. Création d'une base de données contenant des images
    Par gandalf_le_blanc dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/06/2004, 15h29
  3. Cherche un site contenant des sources valables
    Par Kartofel dans le forum Debian
    Réponses: 7
    Dernier message: 14/01/2004, 14h05
  4. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09
  5. Question : ordre des bits ?
    Par Choupi dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 06h22

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