[Lang C] PB Operateur Logique

Résolu/Fermé
Any1_56 - 3 juil. 2008 à 18:13
 Aniy_56 - 4 juil. 2008 à 08:18
Bonjour à vous,

Voilà j'ai effectué un programme en C pour un bouleau, celui ci sert à calculer un Checksum.

La chose est simple, j'ai tout d'abord une chaine de caractères.
Je mets ensuite chacun de ces caractères dans un tableau.
une fois cela fait, je créé un nouveau tableau où je mets les résultas d'opérations XOR.
Je ne donne pas trop de détails car jusque là, tout va bien.
C'est maintenant que vient le problème.


Le dernier résultat que j'obtiens doit être cindé en deux avec une adresse haute et une adresse basse.

par exemple si j'ai 0x3F je dois m'arranger pour avoir 0011 (3 en hexa) pour l'adresse haute et 1111 (F en Hexa) pour l'adresse basse.

Après cela, je dois rajouter une constante 3 devant. Pour reprendre l'exemple, 0011 0011 pour l'adresse haute et 0011 1111 pour l'adresse basse.

J'ai donc Ah= 0x33 et Al= 0x3F

ceci me donne les deux caractères ASCII du checksum soit 3 et ?

Cependant je n'arrive pas à obtenir ces résultats et je ne sais pas si je me suis planté dans le type de variable ou dans les opérateurs...


Voici le code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    char string[100];
    int stringlength=0;
    
    printf ( "Entrer votre chaine de caracteres: ");
    gets (string);
    //calcul de la longueur donnée
    stringlength = strlen (string);
    
    printf ("\nlongueur de la chaine= %d\n\n", stringlength);
    
    
    //Mise en place des caracteres dans le tableau
    char tableau [stringlength];
    
    int idx;
    for ( idx=0; idx<stringlength; idx++)
    tableau [idx] = string[idx];
    
    //affichage des éléments du tableau pour vérification
    
    int i;
    for ( i=0;i<stringlength;i++)
    {
        char data;
        data=tableau[i];
        printf ("\n Valeur n %d= %x \n",i,data);
    }
        
    //Opérations XOR et inscription des résultats dans un tableau
    char tableres [stringlength];
    int y;
    tableres [0] = 0;
    for ( y=1 ; y < (stringlength+1) ; y++)
    {
        
        tableres [y] = tableres [(y-1)]^tableau [(y-1)];
        printf ( "\nXOR n %d= %x \n",y,tableres[y]); 
        
    }
    //cindage de l'adresse en deux
    char al,ah;
    const char trois = '0', F = ;
    ah = tableres [stringlength];
    al = tableres [stringlength];
    //Calcul de l'adresse haute
    ah = ah>>4;
    //printf ("\nResultat ah>>4= %x\n", ah);
    ah = ah | trois;
    printf ("\nResultat ah or 3= %x\n", ah);
    
    //calcul de l'adresse basse
    printf ( "\nAl= %x\n", al);
    al &= F;
    printf ("\nResultat and= %x\n", ah);
    al = al | trois;
    printf ("\nResultat al or 3= %x\n", ah);
    
    
    printf ("\n");
    
    
  system("PAUSE");	
  return 0;
}




C'est encore une ébauche car je teste tout au fur et à mesure.

Merci d'avance

2 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
3 juil. 2008 à 18:30
Salut,

Ya rien dans F. C'est pas censé être égal à 0xf ?
0
Heu oui, c'est une partie sur la quelle je butte. Le 0x0F ou 0000 1111 avec le and est sencé enlevé la premiere partie et garde que la partie basse pour rajouter ensuite la constante trois devant.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
3 juil. 2008 à 20:47
Tout à fait, c'est 0xf qu'il faut mettre. C'est le fonctionnement du truc que tu ne comprends pas.
0
Any1_56 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
3 juil. 2008 à 21:49
Eh bien j'ai déjà essayé cela mais cela ne marche pas...

Voici un fichier pdf que j'avais fait en allemand mais que j'ai retraduit en francais. C'etait pour expliquer comment calculer un checksum à la main.

http://umr.hostfile.ifrance.com/checksum/Checksum.pdf

Comme c'est en ASCII, ca fait la différence entre les grands et petits caractères. Comme indiqué, le protocole est un peu particulier car c'est pour éviter un code de controle.

Dans le checksum, seul le texte est pris en compte.

J'espere que ce fichier pourra aider à mieux comprendre mon PB.

Merci beaucoup pour tes reponses jusqu'a présent.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > Any1_56
3 juil. 2008 à 22:40
Ok je vois, mais tu vais bien expliqué dans ton premier message.

En passant le soucis ne viendrait'il pas du fait que tu affiches ah au lieu de al à la fin?
printf ("\nResultat al or 3= %x\n", ah);
0
Aniy_56 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
4 juil. 2008 à 08:18
O_o" Ah oui exact... Le copier-coller n'a pas que des avantages! ^^

Merci beaucoup pour ton aide, je devrais maintenant etre en mesure de terminer sans soucis.
Merci encore
0