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 :

Copier un long dans un tableau de char?


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut Copier un long dans un tableau de char?
    Ben voilà, un problème qui me parait simple mais j'y arrive pas et je vois pas quelle fonction utiliser.
    Je voudrais copier le contenu d'une variable de type long dans un tableau de caractères...
    J'ai donc ça:

    char message[60];
    long monLong;

    Et donc je veux mettre mon long dans les 4 premiers octets de mon tableau, comment faire?
    J'ai bien essayé avec un memset mais ça me copie 4 fois le même octet au lieu de me copier le tout comme y faut.

    Merci d'avance...

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par the_ionic
    Ben voilà, un problème qui me parait simple mais j'y arrive pas et je vois pas quelle fonction utiliser.
    Je voudrais copier le contenu d'une variable de type long dans un tableau de caractères...
    J'ai donc ça:

    char message[60];
    long monLong;

    Et donc je veux mettre mon long dans les 4 premiers octets de mon tableau, comment faire?
    J'ai bien essayé avec un memset mais ça me copie 4 fois le même octet au lieu de me copier le tout comme y faut.

    Merci d'avance...
    memcpy(message, &monLong, sizeof(monLong);

  3. #3
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    et sprintf aussi, penser aux SVP : http://c.developpez.com/faq/c/?page=...RINGS_strtonum

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_ionic
    Ben voilà, un problème qui me parait simple mais j'y arrive pas et je vois pas quelle fonction utiliser.
    Je voudrais copier le contenu d'une variable de type long dans un tableau de caractères...
    J'ai donc ça:

    char message[60];
    long monLong;

    Et donc je veux mettre mon long dans les 4 premiers octets de mon tableau, comment faire?
    J'ai bien essayé avec un memset mais ça me copie 4 fois le même octet au lieu de me copier le tout comme y faut.
    Selon quels critère (endianess requise ?)

    Si c'est pour un format 'réseau', c'est MSB en tête alors :
    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
     
    #include <stdio.h>
    int main (void)
    {
       unsigned char message[60];
       unsigned long monLong = 0xDEADBEEF;
     
       message[0] = (monLong >> (8 * 3)) & 0xFF;
       message[1] = (monLong >> (8 * 2)) & 0xFF;
       message[2] = (monLong >> (8 * 1)) & 0xFF;
       message[3] = (monLong >> (8 * 0)) & 0xFF;
     
       {
          int i;
          for (i = 0; i < 4; i++)
          {
             printf ("%02X ", message[i]);
          }
          printf ("\n");
       }
       return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Foobar1329
    memcpy(message, &monLong, sizeof(monLong);
    Pas portable. La représentation interne n'est pas forcément celle exigée dans le tableau de [unsigned ]char.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doudouallemand
    Le Monsieur n'a pas parlé de format texte... (Mais c'est vrai que ce n'est pas très clair...)

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Bon pour être plus clair, je fais un truc qui doit envoyer des trames réseaux d'une carte embarquée vers une machine Linux.
    J'ai donc un tableau qui représente mon message (je gère les en-têtes ailleurs).
    Dans mon message, je souhaite pouvoir mettre plusieurs choses dont par exemple un long, puis un autre, puis un autre etc...
    Donc là, dans mon exemple, mon long est une stat que je vais lire à l'aide des drivers de la carte, et je veux simplement la mettre dans le tableau message avant de la rebalancer par le réseau à ma machine Linux.
    Est ce plus clair comme cela??? J'espère! :-)

  8. #8
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas portable. La représentation interne n'est pas forcément celle exigée dans le tableau de [unsigned ]char.
    Ha ben il avait précisé le monsieur

    Dans ce case, mieux vaut aussi travailler avec unsigned long.

    A+

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_ionic
    Dans mon message, je souhaite pouvoir mettre plusieurs choses dont par exemple un long, puis un autre, puis un autre etc...
    Donc là, dans mon exemple, mon long est une stat que je vais lire à l'aide des drivers de la carte, et je veux simplement la mettre dans le tableau message avant de la rebalancer par le réseau à ma machine Linux.
    Si le format réseau est bien 'MSB en tête' (c'est la norme), ma solution est donc la bonne...

    Tu as bien noté que le tableau devait être de type unsigned char, et l'entier de type unsigned long.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Foobar1329
    Dans ce case, mieux vaut aussi travailler avec unsigned long.
    Exact, je mets à jour...

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Oui tout a fait, c'était ce qu'il me fallait (et j'avais oublié de préciser que le tableau était unsigned char en écrivant).

    Merci beaucoup et j'avais effectivement consulté la FAQ avant qui ne répondait pas à ma question mais merci à tous quand même!

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Bon, jsuis vraiment pas au point aujourd'hui, et je deteste faire mon boulet mais là, je crois que c'est le cas alors je m'en excuse...
    Alors donc ça marche bien, le problème, c'est maintenant pour faire la même chose dans le sens inverse, passer de mes 4 octets du tableau à un long.
    J'ai donc:
    unsigned long monLong;
    unsigned char message[1500];

    et je veux récupérer les 4 premiers octets de message qui son censés représenter monLong.

    J'ai essayé memcopy, memset, j'imagine que je dois encore jouer avec les décalages de bits mais j'y arrive pas.

    PS: La solution de la FAQ (sscanf)ne me convient pas car faudrait que je recopie mon message dans un autre tableau représentant une chaine de caractère en découpant etc... enfin c'est pas propre.

    Merci d'avance

  13. #13
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par the_ionic
    Bon, jsuis vraiment pas au point aujourd'hui, et je deteste faire mon boulet mais là, je crois que c'est le cas alors je m'en excuse...
    Alors donc ça marche bien, le problème, c'est maintenant pour faire la même chose dans le sens inverse, passer de mes 4 octets du tableau à un long.
    J'ai donc:
    unsigned long monLong;
    unsigned char message[1500];

    et je veux récupérer les 4 premiers octets de message qui son censés représenter monLong.

    J'ai essayé memcopy, memset, j'imagine que je dois encore jouer avec les décalages de bits mais j'y arrive pas.

    PS: La solution de la FAQ (sscanf)ne me convient pas car faudrait que je recopie mon message dans un autre tableau représentant une chaine de caractère en découpant etc... enfin c'est pas propre.

    Merci d'avance
    He bien, suffit de faire le contraire. Je reprend l'exemple d'Emmanuel où on considère une inversion d'endianess (exple: ce sera grand boutien dans ton message et petit-boutien dans ton appli cliente). Pour expliquer, je récupère chaque byte de msg que je décale à la bonne place pour l'ajouter bit à bit (attention, bien un ajout via | (OR) et non une addition bit à bit (XOR) )) à la variable unsigned long.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <stdio.h>
    #include <limits.h>
     
    #if ( CHAR_BIT != 8  || ULONG_MAX != 0xFFFFFFFFul ) 
    #error "Faut CHAR_BIT sur 8 bits et des long sur 32 bits pour que ça marche"
    #endif
     
    int putUlongInMsg(unsigned char * msg, size_t pos, size_t size, unsigned long var)
    {
       int rc = 0;
     
       if (!msg) {  rc = -1; }
       if (pos > size || (size - pos) < sizeof(unsigned long) ) { rc = -2; }
     
        if (rc >= 0)
        {
           msg[pos] = (var >> (8 * 3)) & 0xFF; /* MSB ici */
           msg[pos+1] = (var >> (8 * 2)) & 0xFF;
           msg[pos+2] = (var >> (8 * 1)) & 0xFF;
           msg[pos+3] = (var >> (8 * 0)) & 0xFF; /* LSB ici */
        }
     
        return rc; 
    }
     
    int getUlongFromMsg(unsigned char const * msg, size_t pos, size_t size, unsigned long * var)
    {
       int rc = 0;
     
       if (!msg) {  rc = -1; }
       if (pos > size || (size - pos) < sizeof(unsigned long) ) { rc = -2; }
       if (!var ) { rc = -3; }
     
        if (rc >= 0)
        {
           *var = 0u;
           *var |= ( msg[pos] & 0xFFul ) << (8 * 3); 
           *var |= ( msg[pos+1] & 0xFFul ) << (8 * 2);
           *var |= ( msg[pos+2] & 0xFFul ) << (8 * 1);
           *var |= ( msg[pos+3] & 0xFFul ) << (8 * 0);
        }
     
        return rc; 
    }
     
    int main(void)
    {
        unsigned char msg[60];
        unsigned long monLong = 0xDEADBEEF;
        unsigned long monLong2;
     
        putUlongInMsg(msg, 0, sizeof(msg)/sizeof(*msg), monLong);
     
        printf("%#lX\n", monLong);
     
        getUlongFromMsg(msg, 0, sizeof(msg)/sizeof(*msg), &monLong2);
     
        printf("%#lX\n", monLong2);
     
        return 0;
    }
    A+

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_ionic
    Bon, jsuis vraiment pas au point aujourd'hui, et je deteste faire mon boulet mais là, je crois que c'est le cas alors je m'en excuse...
    Alors donc ça marche bien, le problème, c'est maintenant pour faire la même chose dans le sens inverse, passer de mes 4 octets du tableau à un long.
    J'ai donc:
    unsigned long monLong;
    unsigned char message[1500];

    et je veux récupérer les 4 premiers octets de message qui son censés représenter monLong.
    C'est la manip inverse non ?
    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
     
    #include <stdio.h>
    int main (void)
    {
       unsigned char message[60] =
          {
             0xDE, 0xAD, 0xBE, 0xEF
          };
       unsigned long monLong = 0;
     
       monLong |= message[0] << ((8 * 3) & 0xFF);
       monLong |= message[1] << ((8 * 2) & 0xFF);
       monLong |= message[2] << ((8 * 1) & 0xFF);
       monLong |= message[3] << ((8 * 0) & 0xFF);
     
       printf ("%08lX\n", monLong);
       return 0;
    }

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Encore une fois merci à tous pour votre aide...
    Faudrait que je songe à rétribuer une partie de mon salaire à ceux qui m'aide ;-)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par the_ionic
    Encore une fois merci à tous pour votre aide...
    Faudrait que je songe à rétribuer une partie de mon salaire à ceux qui m'aide ;-)
    Bah, non, ici, l'aide est gratuite. Par contre tu me ferais plaisir en soignant ton expression française et ton orthographe...
    • Rétribuer : Payer
    • Redistribuer : Rendre une partie...

    ceux qui m'aident

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

Discussions similaires

  1. Entrer une grille dans un tableau de char
    Par killersky4 dans le forum Débuter
    Réponses: 3
    Dernier message: 05/01/2009, 16h41
  2. Réponses: 11
    Dernier message: 14/07/2007, 18h44
  3. Intégrer une vaiable float dans un tableau de char
    Par NoritakaRomain dans le forum C
    Réponses: 2
    Dernier message: 14/05/2007, 15h19
  4. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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