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 :

fonction qui transforme un entier en octet


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut fonction qui transforme un entier en octet
    Bonjour,

    Je suis a la recherche d'une fonction en C qui permette de transformer un entier en octer. Un truc du genre :
    char * IntToOctet (int entier)

    Est ce que quelqu'un a deja fait ca?

    merci

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Il faut travailler avec les opérateurs bitwise.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    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 seriousme
    Il faut travailler avec les opérateurs bitwise.
    Montre...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Montre...
    C'est un défi?

    Il faut juste faire gaffe à la taille des entiers utilisés avec "sizeof".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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 personne64
    Je suis a la recherche d'une fonction en C qui permette de transformer un entier en octer. Un truc du genre :
    char * IntToOctet (int entier)
    Un octet est un objet d'exactement 8 bits. J'ai du mal à saisir ce que tu veux faire exactement.

    On peut faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int x = 1234 & 0xFF;
    qui mets le bits de poids fort à 0 et laisse les 8 bits de poids faibles intacts... mais je ne suis pas sûr que ce soit ça que tu veuilles...
    Pas de Wi-Fi à la maison : CPL

  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 seriousme
    C'est un défi?

    Il faut juste faire gaffe à la taille des entiers utilisés avec "sizeof".
    Ca m'interesse de savoir ce que tu as compris de la question, parce que pour moi, c'est flou...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ca m'interesse de savoir ce que tu as compris de la question, parce que pour moi, c'est flou...
    Je pense qu'il veut afficher
    au lieu de 170.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    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 seriousme
    Je pense qu'il veut afficher
    au lieu de 170.
    Peut être...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    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
    void convert(int n){
                        int binaire[32]={0};
                        int i=0;
                        int mask=1;
                        int a;
                        for(i=0;i<32;i++){
                                          a=0;
                                          if((n&mask)==mask){
                                                           a=1;
                                                           }
                                          binaire[i]=a;
                                          mask=mask<<1;
     
                                          }
                        for(i=31;i>=0;i--){
                                           printf("%d",binaire[i]);
                                          }
                                          }
    Pas astucieux, pas optimisé mais l'idée est là.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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 seriousme
    L'interface du P.O. était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * IntToOctet (int entier)
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut par exemple 3 donne 00000011
    Un programme qui
    par exemple pour 3 donne 00000011


    je test le code , merci

  12. #12
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    L'interface du P.O. était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * IntToOctet (int entier)
    No problem:
    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
    char* convert(int n){
                        char *binaire=calloc(33,sizeof(char));
                        int i=0;
                        int mask=1;
                        char a;
                        for(i=0;i<32;i++){
                                          a='0';
                                          if((n&mask)==mask){
                                                           a='1';
                                                           }
                                          binaire[31-i]=a;
                                          mask=(mask<<1);
     
                                          }
                                          binaire[32]=0;
                                          return binaire;
                                          }
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *s=convert(3640);
    printf("%s",s);
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  13. #13
    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 personne64
    Un programme qui
    par exemple pour 3 donne 00000011
    Ah, il fait être plus précis.

    Tu veux, à partir de la valeur d'un entier, produire une chaine représentanat celle-ci sous forme binaire sur une largeur de 8 bits.

    • L'entier doit être non signé.
    • La valeur doit être comprise entre 0 et 255
    • Il est souhaitable de fournir à la fonction l'adresse et la taille d'un tableau de char.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int integer2bin (char *s_out, size_t size, unsigned int value);
    La fonction retourne 0 si tout c'est bien passé ou 1 en cas d'erreur :
    • Adresse de s_out valant 0.
    • Taille de s_out < 9.
    • Valeur de value > 255
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est bon j'ai édité.
    Ca marche mais je ne comprend pas pourquoi l'autre buggait.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je m'étais amusé à faire ça sur un autre forum
    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 *binaire2(unsigned int x)
    {
        unsigned int n = 1 << CHAR_BIT * (sizeof(unsigned int)) - 1; // pour être plus portable (include <limits.h>)
        unsigned int val;
        int flag = 0;
        char *res = malloc(CHAR_BIT * (sizeof(unsigned int))+ 1);
        char *ptr;
     
        if (res)
        {
            ptr = res;
            while (n != 0)
            {
                val = x & n;
                if (flag == 1 && val == 0)
                    *ptr++ = '0';
                else
                if (val)
                {
                    *ptr++ = '1';
                    flag = 1;
                }
                n >>= 1;
            }
            *ptr = 0;     
        }
        return res;
    }
    Le programme n'écrit pas les 0 "inutiles", si il faut les écrire il suffit d'enlever le flag.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Le programme n'écrit pas les 0 "inutiles"
    Le souci c'est qu'il ne formate pas sous forme d'octet:
    avec 70 on obtient 1000110, 01000110 est plus "propre".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  17. #17
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    D'où ma remarque sur le fait qu'il suffit de supprimer le flag
    D'autre part je travaille sur des unsigned int pas des char !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  18. #18
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Mais sans le flag il y a des zéros en trop, comme avec la mienne.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  19. #19
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut

    Je n'ai pas suivi toute la discussion, mais là, j'avoue que je ne comprends rien, il y a des 0 en trop ou pas, que veux-tu exactement ?
    Petit rappel ma fonction est faite pour des unsigned int, pas des char !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  20. #20
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Voila là c'est un formatage octet par octet:
    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
    char* convert(int n){
                        char *binaire=calloc(33,sizeof(char));
                        int i=0;
                        int mask=1;
                        char a;
                        for(i=0;i<32;i++){
                                          a='0';
                                          if((n&mask)==mask){
                                                           a='1';
                                                           }
                                          binaire[31-i]=a;
                                          mask=(mask<<1);
                                          }
                                          char *bin=strchr(binaire,'1');
                                          binaire=bin-(bin-binaire)%8;
                                          return binaire;
                                          }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2007, 22h49
  2. fonction qui transforme une chaine en majuscule
    Par kawther dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2007, 11h47
  3. Réponses: 6
    Dernier message: 22/11/2006, 10h38
  4. [Librairies] fonction qui transforme le rtf en texte
    Par The Wretched dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 15/12/2005, 13h02
  5. Fonction qui transforme chaine de caractère par une autre?
    Par geoffreykill dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 09/12/2004, 14h31

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