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 :

Problème de chaine


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut Problème de chaine
    Bonsoir

    J'ai un petit problème et j'aimerai avoir votre aide sur celui-ci.

    J'ai une chaine caractère qui est en hexadécimal et je souhaiterai mettre les caractères qui composent cette chaine qui sont de ce style : "0x00", "0x03" etc... alors que dans ma chaine j'ai 0003... dans un tableau.

    Par exemple je voudrais mettre :

    Tableau[0] = ChaineCarac[0];

    mais le Tableau contiendrai : "0x00" et non "00".

    J'espère avoir été assez clair.

    comment puis-je faire cela ?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nemesis007
    J'ai un petit problème et j'aimerai avoir votre aide sur celui-ci.<...> J'espère avoir été assez clair.
    Pas vraiment !

    As-tu bien conscience que le représentation interne des données est binaire, et que la représentation 'textuelle' n'est qu'un manière de présenter ces données ?

    Pour mieux définir ton problème, je te propose de l'aborder différemment.

    Tout programme informatique se résume, en gros à :

    Des données d'entrées -> un ou des traitements -> des données de sorties.

    Je t'invite donc à définir plus précisément quels sont ces trois éléments.

    • Quelles sont les données en entrées (nature, format, type...)
    • Quelles sont les données en sortie(nature, format, type...)
    • Quels sont le ou les traitements attendus ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    • Quelles sont les données en sortie(nature, format, type...)
    • Quels sont le ou les traitements attendus ?
    • Quelles sont les données en entrées (nature, format, type...)
    J'ai une température que je génère aléatoirement et que je dois renvoyer dans une trame. Dans cette trame, toutes les données sont des paquets de 2 octets, par exemple : "0403020320CRC".

    Ce qui est en gras dépend de la température, c'est à dire que si j'ai 800° (0320 en hexadécimal), je dois convertir cette valeur en hexadécimal puis la concaténer à la chaine déjà existante, qui ne change pas et qui est : "040302". Après avoir copié ces caractères dans la chaine, j'appelle une fonction qui me permet de "créer" le CRC correspond à cette chaine de caractère

    Voici le code qui j'espère vous aidera à comprendre mieux si je puis dire ce que je dois faire :
    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
     
    	char HexTemp1[5];
    	Temperature1 = 800;
    	char ChaineAEnvoyee[20];
    	int Taille_max = 6;
    	int L_Indice;
    	char TemperatureHexa[5];
    	char Tableau[8];
    	strcpy(ChaineAEnvoyee,"040302"); // chaine de départ
    	sprintf(HexTemp1,"%X",Temperature1); // conversion en hexadecimal de la valeur de la temperature
    	strcpy(TemperatureHexa,HexTemp1); 
    	if(HexTemp1[3] == '\0') // boucle me permettant de rajouter le '0' (pour 320 -> 0320).
    	{
    		TemperatureHexa[0] = '0';
    		TemperatureHexa[1] = HexTemp1[0];
    		TemperatureHexa[2] = HexTemp1[1];
    		TemperatureHexa[3] = HexTemp1[2];
    		TemperatureHexa[4] = '\0';
    		strcat(ChaineAEnvoyee,TemperatureHexa); // concaténation de la chaine pour ainsi donner : "0403020320" dans cet exemple
     
    	}
    	else
    	{
    		strcat(ChaineAEnvoyee,TemperatureHexa); // concaténation de la chaine pour ainsi donner : "0403020320" dans cet exemple
     
    	}
     
    	CalculCRCTemp(Tableau,Taille_max);

    fonction CalculCRCTemp(char *P_Tableau, int P_TailleMax) :

    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
     
    unsigned char* Adresse_tab;
    	unsigned short int CalculCRC  = 0xFFFF;
    	unsigned char ChaineCRC[4];
    	unsigned char TamponCRC[4];
    	unsigned short int Polynome = 0xA001;
    	unsigned char CptOctet = 0;
    	unsigned char CptBit = 0;
    	unsigned char Parity= 0;
    	int ResultatCRC;
    	int Taille_max;
     
    	Adresse_tab = (unsigned char*)P_Tableau;
    	Taille_max = P_TailleMax;
     
    	CalculCRC = 0xFFFF;
    	Polynome = 0xA001; // Polynôme = 2^15 + 2^13 + 2^0 = 0xA001.
     
    	for ( CptOctet= 0 ; CptOctet < Taille_max ; CptOctet++)
    	{
    		 CalculCRC  ^= *( Adresse_tab + CptOctet); //Ou exculsif entre octet message et CRC
     
    		 for ( CptBit = 0; CptBit <= 7 ; CptBit++) /* Mise a 0 du compteur nombre de bits */
    		 {
    			Parity = CalculCRC ;
    			CalculCRC  >>= 1; // Décalage a droite du crc
    			if (Parity%2 == TRUE) 
    			{
    				 CalculCRC  ^= Polynome; // Test si nombre impair -> Apres decalage à droite il y aura une retenue
    			 }							 // "ou exclusif" entre le CRC et le polynome generateur.
    		}								
    	}
    	return TRUE;

    Après avoir calculé le CRC correspondant à la chaine de caractère, je concatene la chaine et le CRC pour formé : "0403020320CRC".

    Citation Envoyé par Emmanuel Delahaye
    Pas vraiment !

    As-tu bien conscience que le représentation interne des données est binaire, et que la représentation 'textuelle' n'est qu'un manière de présenter ces données ?
    Oui je sais bien mais je pense que je m'embrouille trop

    Voila. J'espère avoir répondu à tes questions soit par le code, soit par mes explications.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nemesis007
    J'ai une température que je génère aléatoirement et que je dois renvoyer dans une trame. Dans cette trame, toutes les données sont des paquets de 2 octets, par exemple : "0403020320CRC".
    Stop !

    Ces guillemets ont-ils un sens ? C'est à dire, les données sont-elles codées sous la forme d'une chaine de caractères représentant des valeurs en hexadécimal, ou s'agit-il de données binaires que tu as représenté ici de façon hexadécimal, pour qu'on puisse les lire ?

    Autrement dit, tu émets un message de 6 octets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [0] 04
    [1] 03
    [2] 02
    [3] 03
    [4] 20
    [5] CRC
    ou de 12 octets ?
    (ASCII)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     [0] 30 '0' 
     [1] 34 '4'
     [2] 30 '0'
     [3] 33 '3'
     [4] 30 '0'
     [5] 32 '2'
     [6] 30 '0'
     [7] 33 '3'
     [8] 32 '2'
     [9] 30 '0'
    [10] 3? CRC High
    [11] 3? CRC Low
    Ce qui est en gras dépend de la température, c'est à dire que si j'ai 800° (0320 en hexadécimal), je dois convertir cette valeur en hexadécimal puis la concaténer à la chaine déjà existante, qui ne change pas et qui est : "040302". Après avoir copié ces caractères dans la chaine, j'appelle une fonction qui me permet de "créer" le CRC correspond à cette chaine de caractère
    Donc, si j'ai bien compris, le transport des données se fait sous une forme textuelle représentant la traduction en hexadécimale de 6 octets. C'est bien ça ? (donc le 2ème format : textuel)

    Etant donné qu'il y a un calcul de CRC en jeu, et que celui-ci doit se faire sur des valeurs binaires, je suggère de travailler 'en interne' avec un tableau de 6 unsigned char dans lequel tu places les données ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [0] 04
    [1] 03
    [2] 02
    [3] Temperature (MSB)
    [4] Temperature (LSB)
    [5] CRC (0 par défaut)
    Avant l'acquisition de la température, tu prépares le tableau avec les valeurs qui vont bien dans [0], [1] et [2] (des valeurs fixes, si j'ai bien compris) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       unsigned char tab[6] = {4, 3, 2};
    au moment de l'acquisition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       unsigned temp = get_temp();
    tu places le MSB en [3] et le LSB en [4]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       tab[3] = (temp >> (8 * 1)) & 0xFF;
       tab[4] = (temp >> (8 * 0)) & 0xFF;
    ensuite, tu calcules le CRC sur les octets [0] à [4], et tu places le résultat en [5].

    Ce n'est que là, avant de transmettre le résultat, que tu convertis le tableau de données en représentation texuelle hexadécimal de la façon suivante (brute force) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       char buf_ems[sizeof "xxxxxxxxxxxx"];
     
       sprintf ("%02X%02X%02X%02X%02X%02X",
                 tab[0],
                 tab[1],
                 tab[2],
                 tab[3],
                 tab[4],
                 tab[5]
                 );
    buf est maintenant une chaine hexadécimale bien formée représentant les valeurs de 6 octets.

    Elle peut être transmise au dispositif d'émission.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut
    Je pense que tu as tout à fait compris le problème et je pense que ca devrait marcher. Je posterai ici dès que j'aurai tester ta solution mais pour l'instant, j'ai un dossier personnel à préparer et à présenter à l'oral.


    Merci infiniment pour ton aide !

Discussions similaires

  1. [MySQL] problème de chaine de caractère
    Par Leinad dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/10/2006, 14h52
  2. Problème Liste chainée
    Par skyangel dans le forum C++
    Réponses: 16
    Dernier message: 07/06/2006, 13h14
  3. [FLASH 8] Problème de chaine de caractère
    Par dom_dev dans le forum Flash
    Réponses: 7
    Dernier message: 02/03/2006, 17h42
  4. [Oracle 8i et ADO] Problème de chaine de connexion
    Par hrezzaz dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/10/2005, 17h52
  5. Problème de chaine sur une page HTML
    Par Kerod dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/11/2004, 16h23

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