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. #21
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 seriousme
    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;
                                          }
    Mais c'est quoi cette mise en page démentielle ?
    Regle ton éditeur comme ça :

    - remplacer les tabulation par des espaces
    - une tabulation = 3 espaces

    Petit test unitaire :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    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;
    }
     
    #define N(a) (sizeof(a)/sizeof*(a))
     
    int main()
    {
       struct test
       {
          int tst;
          int n;
          char const *s;
       };
     
       static struct test const a[] =
          {
             {
                10, 0, "00000000"
             },
             {
                11, 1, "00000001"
             },
             {
                12, 0x7F, "01111111"
             },
             {
                13, 0x80, "10000000"
             },
             {
                14, 0xFF, "11111111"
             },
             {
                15, -1, "11111111"
             },
          };
       int err = 0;
       size_t i;
       for (i = 0; !err && i < N(a); i++)
       {
          struct test const *p = a + i;
          char* s = convert(p->n);
          if (s != NULL)
          {
             if (strcmp (s, p->s) != 0)
             {
                printf ("Error at test #%d '%s' / '%s'\n", p->tst, s, p->s);
                err = 1;
             }
             free (s), s = NULL;
          }
       }
       if (!err)
       {
          puts("P A S S E D");
       }
     
       return 0;
    }
    Peut mieux faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error at test #15 '11111111111111111111111111111111' / '11111111'

  2. #22
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Ma petite contribution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void hex2bin (unsigned int data, char *str, int width)
    {
       int i,j;
     
       for (i=0, j=width; i<width; i++)
          str[--j] = (data >> i) & 1 ? '1' : '0' ;
     
       str[i] = '\0';
    }
    Il ya peut etre mieux....
    Pas besoin d'explication, c'est trivial...

  3. #23
    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 : 39
    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
    Par défaut
    Mais c'est quoi cette mise en page démentielle ?
    Je trouve plus propre d'exagérer le décalage des blocs comme en Python même si il est vrai que ici j'ai mal mit mes accolades.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 947
    Par défaut
    C'est ça que tu veux ?
    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
    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;
        char *res = malloc(CHAR_BIT * (sizeof(unsigned int))+ sizeof(unsigned int) + 1);
        char *ptr;
        // pour compter les bit et mettre les espaces
        int espace = 0;
     
        if (res)
        {
            ptr = res;
            while (n != 0)
            {
                val = x & n;
                if (val == 0)
                    *ptr++ = '0';
                else
                    *ptr++ = '1';
                 n >>= 1;
                // on ajoute l'espace pour séparer les bytes
                espace ++;
                if (espace == CHAR_BIT)
                {
                    *ptr ++ = ' ';
                    espace = 0;
                }
            }
            *ptr = 0;     
        }
        return res;
    }
    5 donne "00000000 00000000 00000000 00000101"
    "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

  5. #25
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Je le refais avec un main() :
    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
    #include <stdio.h>
     
    void hex2bin (unsigned int data, char *str, int width)
    {
       int i,j;
     
       for (i=0, j=width; i<width; i++)
          str[--j] = (data >> i) & 1 ? '1' : '0' ;
     
       str[i] = '\0';
    }
     
     
    int main(void)
    {
       char str[16];
     
       hex2bin (0xAA, str, 8);
       printf("%s\n", str);
       return 0;
    }

  6. #26
    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 : 39
    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
    Par défaut
    Citation Envoyé par crocodilex
    Ma petite contribution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void hex2bin (unsigned int data, char *str, int radix)
    {
       int i,j;
     
       for (i=0, j=radix; i<radix; i++)
          str[--j] = (data >> i) & 1 ? '1' : '0' ;
     
       str[i] = '\0';
    }
    Il ya peut etre mieux....
    Pas besoin d'explication, c'est trivial...
    Emdel va gueuler:code illisible, effet de bord...

  7. #27
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 crocodilex
    Ma petite contribution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111'
    crocodilex: Error at test #10 '00' / '00000000'
    Candidat suivant ...
    Ah, radix, c'est la largeur... fallait le dire.. Pour moi, c'est la base, alors j'ai mis 2 !

    Avec 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111'
    crocodilex: P A S S E D
    Mais il faut remplacer 'radix' par 'width', ce sera plus clair. Le code doit être 'auto-documenté'.

  8. #28
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111'
    crocodilex: Error at test #10 '00' / '00000000'
    Candidat suivant ...
    Ah, radix, c'est la largeur... fallait le dire.. Pour moi, c'est la base, alors j'ai mis 2 !

    Avec 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111'
    crocodilex: P A S S E D
    Mais il faut remplacer 'radix' par 'width', ce sera plus clair. Le code doit être 'auto-documenté'.
    Ouf j'ai eu peur
    En effet width et plus causant que radix...
    Je corrige tout de suite.

  9. #29
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 Trap D
    C'est ça que tu veux ?
    <...>
    5 donne "00000000 00000000 00000000 00000101"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111'
    crocodilex: P A S S E D
    Trap D: Error at test #10 '00000000 00000000 00000000 00000000 ' / '00000000'

  10. #30
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par seriousme
    Emdel va gueuler:code illisible, effet de bord...
    Je n'avais pas lu ton mesage...
    Tu parles de quel effet de bord ? Quelque chose m'a échappé ? Dis moi où, que je corrige ça tout de suite.
    Pour le code illisible, tu fais certainement allusion à l'opérateur ternaire....Oui, je sais, beaucoup de developpeurs n'aiment pas cette écriture, mais moi j'aime bien. Désolé...

  11. #31
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 crocodilex
    Tu parles de quel effet de bord ? Quelque chose m'a échappé ? Dis moi où, que je corrige ça tout de suite.
    Ta fonction n'a pas d'information de taille. Elle peut donc écrire hors des limites du tableau de char ...

    J'ajouterais une information 'taille'

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 947
    Par défaut
    Emmanuel, c'est quoi ton test ?????
    Quelle est mon erreur ?
    "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

  13. #33
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 Trap D
    Emmanuel, c'est quoi ton test ?????
    Quelle est mon erreur ?
    Non conformité avec la spec (format 8 bits)

    Ignorer ce qui est au-dessus du trait...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* --- ... ----------- */

  14. #34
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ta fonction n'a pas d'information de taille. Elle peut donc écrire hors des limites du tableau de char ...

    J'ajouterais une information 'taille'
    Merci pour l'info. Ci-joint une version légèrement améliorée suite à cette remarque :
    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
    #include <stdio.h>
     
    #define STRSIZE 16
     
    /*
    **=============================================================================
    ** hex2bin      : Convert data into binary format
    **=============================================================================
    ** Output :
    **    - str     : string containing data conversion into binary format
    ** Input : 
    **    - data    : data to be converted
    **    - width   : binary format width
    **    - strSize : str max size
    ** Return values :
    **    If successful, hex2bin returns 1. If there is an error (string size
    **    error), hex2bin returns 0.
    **=============================================================================
    */
    int hex2bin (unsigned int data, char *str, size_t strSize, unsigned char width)
    {
       int i, j, res=1;
     
       if (width < strSize) {
          for (i=0, j=width; i<width; i++)
             str[--j] = (data >> i) & 1 ? '1' : '0' ;
          str[i] = '\0';
       }
       else
          res = 0;
     
       return res;
    }
     
     
    int main(void)
    {
       char str[STRSIZE];
     
       if ( !hex2bin(0xAA, str, STRSIZE, 8) )
          printf("String size error\n");
       else
          printf("%s\n", str);
     
       return 0;
    }

  15. #35
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 crocodilex
    Merci pour l'info. Ci-joint une version légèrement améliorée suite à cette remarque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       if (width < strSize) {
          for (i=0, j=width; i<width; i++)
             str[--j] = (data >> i) & 1 ? '1' : '0' ;
          str[i] = '\0';
    Et la place pour le 0 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if (width < strSize - 1) {

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 947
    Par défaut
    Il faut comparer ce qui est comparable, je n'ai jamais prétendu traduire un char mais un unsigned int, c'est différent, donc ce test n'est pas valable.
    "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

  17. #37
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Et la place pour le 0 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if (width < strSize - 1) {
    La condition (width < strSize) en tient compte, à moins que j'ai loupé quelque chose !!!

  18. #38
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 crocodilex
    La condition (width < strSize) en tient compte, à moins que j'ai loupé quelque chose !!!
    Exact. Je suis fatigué. Vivement mardi que je reprenne le boulot !

  19. #39
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Par défaut
    Si vous savez comment introduire du code assembleur dans un programme C, je peux vous donnez le script assembleur qui fait ça. C'est plus cours, plus rapide en temps d'execution et aussi efficace.

  20. #40
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Par défaut
    Personnellement je n'ai pas essayé d'incorporer un script assembleur avec le langage C. J'ai deja vu un programme pascal incorporant un script assembleur.

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