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 :

convertir un int en unsigned char[]


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Par défaut convertir un int en unsigned char[]
    Salut tout le monde
    j'ai une souci pour convertir un int en unsigned char[]
    voir le code c++ qui affiche l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a=100;
    unsigned char ch[]=(unsigned char[])a;

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut, et bienvenue sur le forum.

    Pourrais tu être un peu plus précis sur ce que tu souhaites faire

    Si l'idée est de pouvoir convertir une variable de type int en chaine de caractères, je te conseillerais volontiers de faire un petit tour du coté de la FAQ.

    Si l'idée est "simplement" de pouvoir utiliser les quatre octets d'un entier sous la forme de caractère (donc d'une variable capable de ne représenter que 255 valeurs), tu pourrais parfaitement utiliser memcpy ou reinterpret_cast (l'entrée de la FAQ portant sur la lecture de fichiers binaires peut te servir d'exemple ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i=132456687;
    unsigned char tab[4];
    memcpy(tab, &int);
    for(int j=0;i<4;++j)
        cout<<tab[j]<<endl;
    Fais attention au fait que tu risque d'être confronté à des problèmes de boutisme en travaillant de la sorte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Ca dépend de ce que tu entend par convertir (il y a rarement un seul sens à convertir). Si tu cherche à créer un tableau d'unsigned char avec la valeur de a dans la première case tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char ch[] = {a};

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Par défaut
    Merci j'ai résolu mon problème avec cast de int en char puis de ce char en unsigned char
    voir le code c++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i;
         char buffer [256];
         i=100;
         itoa (i,buffer,10);
         printf ("decimal: %s\n",buffer);
    	 unsigned char reg[256];
    	 sprintf((char*)reg,"%s",buffer);
    	  printf ("voila: %s\n",reg);
    Mais est ce que je peut allouer de memoire pour les tableau sans ecrire 256 comme l'exemple de malloc

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par info21 Voir le message
    Merci j'ai résolu mon problème avec cast de int en char puis de ce char en unsigned char
    voir le code c++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i;
         char buffer [256];
         i=100;
         itoa (i,buffer,10);
         printf ("decimal: %s\n",buffer);
    	 unsigned char reg[256];
    	 sprintf((char*)reg,"%s",buffer);
    	  printf ("voila: %s\n",reg);
    Mais, là, tu fais du C, et non du C++...

    Ce n'est pas faux en soi, mais ce n'est pas cette section

    Alors, si tu veux coder en C, dis le nous, nous changerons ta question de rubrique, autrement, nous pouvons réellement te conseiller:
    1. d'utiliser la classe string (disponible dans l'espace de noms std, par inclusion du fichier d'en-tête <string> )
    2. d'utiliser les flux de conversion tels qu'indiqués dans les liens que je fourni dans ma première réponse

    Mais est ce que je peut allouer de memoire pour les tableau sans ecrire 256 comme l'exemple de malloc
    Tu peux toujours décider de créer un tableau de manière dynamique plutôt qu'un tableau de taille fixe...

    Il faut juste veiller:
    1. à ce que la taille du tableau dynamique soit suffisante pour contenir tous les éléments
    2. à correctement libérer la mémoire allouée à ton tableau une fois que tu n'en a plus besoin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 544
    Par défaut
    il ne s'agissait donc pas d'une 'conversion'

    vous savez, vous pouvez directement utiliser itoa avec un unsigned char *

    indépendamment de cela, copier un tableau de caractères dans un autre via sprintf c'est vraiment pas efficace, strcpy est là pour cela

    un tableau de 256 caractères c'est vraiment beaucoup trop, même avec une machine 64 bits il aurait suffit de 24

    comme l'exemple de malloc
    quel exemple ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  7. #7
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais, là, tu fais du C, et non du C++...

    Ce n'est pas faux en soi, mais ce n'est pas cette section

    Alors, si tu veux coder en C, dis le nous, nous changerons ta question de rubrique, autrement, nous pouvons réellement te conseiller:
    1. d'utiliser la classe string (disponible dans l'espace de noms std, par inclusion du fichier d'en-tête <string> )
    2. d'utiliser les flux de conversion tels qu'indiqués dans les liens que je fourni dans ma première réponse

    Tu peux toujours décider de créer un tableau de manière dynamique plutôt qu'un tableau de taille fixe...

    Il faut juste veiller:
    1. à ce que la taille du tableau dynamique soit suffisante pour contenir tous les éléments
    2. à correctement libérer la mémoire allouée à ton tableau une fois que tu n'en a plus besoin
    c'est vrai mais j'utilise une dll qui demande unsigned char en paramètre de fonction qu'elle contient mais juste une question pour malloc elle travail avec les pointer comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *buffer = (char *) malloc(sizeof(char));
    mais comment je peut l'utiliser avec le type
    comment je peut l'utiliser
    Merci pour vos aides

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par info21 Voir le message
    mais comment je peut l'utiliser avec le type
    comment je peut l'utiliser
    Merci pour vos aides
    Tu confonds...

    Le type, c'est... char, quoi qu'il arrive...

    char * indique qu'il s'agit... d'un pointeur sur une variable de type char (un pointeur n'étant qu'une variable contenant... l'adresse à laquelle se trouve la variable réellement utilisée)
    char [] indique qu'il s'agit... d'un tableau de caractère dont le nombre d'éléments est indiqué entre les crochets ou, à défaut, suffisamment important pour représenter le nombre d'éléments donnés lors de l'initialisation (qui doit alors avoir lieu au moment de la déclaration de la variable).

    Or, en C et en C++, un tableau est identifié par... l'adresse à laquelle se trouve le premier élément de celui-ci.

    Ainsi, le code suivant est tout à fait valide et correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char tab[10];
    char *ptr=tab; //ptr pointe sur... tab[0];
    for( int i=0;i<10;++i)
    {
        /*...*/
       ++ptr; // ptr pointera respectivement sur tab[1],tab[2], tab[3], ...
    }
    La seule chose que tu ne pourra pas faire, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tab[10];
    tab=(char*) malloc(sizeof(char)*12); //DANGER
    Donc, si tu veux gérer dynamiquement la taille de ton tableau, tu dois le prévoir dés le départ, et utiliser un pointeur sur char:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void foo()
    {
        char *ptr=NULL; // initialisé à une adresse connue comme invalide
        /* ...*/
        if(!ptr) // si ptr ne pointe encore sur rien
            ptr=(char*)malloc(sizeof(char)* taille);
        else //sinon, il faut utiliser realloc
            ptr=(char*)realloc(sizeof(char)* nouvelle_taille);
        /* on peut utiliser ptr ici */
    }
    Mais il faut également être conscient que cette approche est une approche pure C
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Tu peux faire à la rigueur qqch comme cela:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int a=100;
    unsigned char ch[UCHAR_MAX];
    ch[0]=(unsigned char)a;
    mais tu ne peux pas déclarer un tableau:


    car le type est incomplet. Il faut la taille

  10. #10
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 544
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char ch[UCHAR_MAX];
    que viens faire UCHAR_MAX dans cette histoire ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  11. #11
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    que viens faire UCHAR_MAX dans cette histoire ?
    c'est pas la taille standard que peux prendre tableau de d'Uchar?

  12. #12
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 544
    Par défaut
    il n'y a pas de taille 'standard' pour les tableaux

    UCHAR_MAX est la valeur max que peut prendre un unsigned char, donc 255 pour un caractère mémorisé sur 8 bits
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

Discussions similaires

  1. Convertir un UNSIGNED INT en deux UNSIGNED CHAR
    Par petitnul12 dans le forum C
    Réponses: 36
    Dernier message: 03/04/2013, 22h09
  2. Convertir un int en char
    Par heruwenli dans le forum C++
    Réponses: 3
    Dernier message: 06/02/2007, 13h41
  3. int, unsigned char ou bool ?
    Par BNS dans le forum C++
    Réponses: 10
    Dernier message: 21/06/2006, 21h59
  4. Méthode pour convertir wxstring en int et en char**
    Par duranton dans le forum wxWidgets
    Réponses: 7
    Dernier message: 21/05/2006, 20h55
  5. Réponses: 6
    Dernier message: 28/10/2005, 12h11

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