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 :

copie d'une partie de la valeur d'un pointeur


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut copie d'une partie de la valeur d'un pointeur
    Bonjour,

    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
    void dump(const uint8_t *buf, size_t buflen, bool bare)
    {
    int i=0;
    char * bu = (char *) malloc(100);
    bu =buf+5;
        if (bare)
        {
            while(buflen--)
     
    	 	printf("%02X%s", *buf++, (buflen > 0) ? " " : "");
     
     
    do
    {
    printf("%c",*bu);
    }
    while(*bu++);
    }
    }
    Je souhaite copier une partie de la valeur de buf dans bu (à partir de la 6émé case du buf)

    début : buf = buf +5 fin : buflen =buflen -7


    J'ai fait bu =buf+5; mais ca marche pas, y a t-il quelqu'un qui a une idée comment ca marche et comment faire pour la limitation à la fin (buflen =buflen -7)

    buflen est le nombre d'instruction.

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Il semble que memcpy réponde au besoin, ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(bu, &buf[5], buflen-7)
    ɹǝsn *sıɹɐlos*

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    *(buf+5) doit fonctionner, par contre ça ne sert à rien d'allouer de la mémoire avec malloc si c'est pour perdre le pointeur sur la zone allouée à la ligne suivante, l'un dans l'autre y'a pas besoin d'allouer de mémoire ici

    je te propose un truc dans ce style, surement très perfectible :
    Code c : 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
    #define NUM 32
     
    void dump (const char *buf, unsigned int buflen, unsigned int offset) {
       int line = 0, column = 0, nblines = buflen / NUM;
       unsigned char c;
     
       for (line = 0; line <= buflen / NUM; line++) {
          printf ("%08x  ", offset + line * NUM);
          for (column = 0; column < NUM; column++) {
             if ((line < nblines) || ((line == nblines) && (column <= buflen % NUM))) {
                c = *(buf + line * NUM + column);
                printf ("%02x%s", c, column == NUM - 1 ? "" : " ");
             } else {
                printf ("  %s", column == NUM - 1 ? "" : " ");
             }
         }
         printf ("  |");
         for (column = 0; column < NUM; column++) {
             if ((line < nblines) || ((line == nblines) && (column <= buflen % NUM))) {
                c = *(buf + line * NUM + column);
                printf ("%c", (c > 31 && c < 128) ? c : '.' );
             }
          }
          printf ("|\n");
       }
    }
     
    int main (void) {
       dump("une petite fonction qui permet de dumper n'importe quoi y compris du binaire \xde\xad\xbe\xef et réaliser un affichage pas trop dégueu", 124, 0x12340000);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    12340000  75 6e 65 20 70 65 74 69 74 65 20 66 6f 6e 63 74 69 6f 6e 20 71 75 69 20 70 65 72 6d 65 74 20 64  |une petite fonction qui permet d|
    12340020  65 20 64 75 6d 70 65 72 20 6e 27 69 6d 70 6f 72 74 65 20 71 75 6f 69 20 79 20 63 6f 6d 70 72 69  |e dumper n'importe quoi y compri|
    12340040  73 20 64 75 20 62 69 6e 61 69 72 65 20 de ad be ef 20 65 74 20 72 c3 a9 61 6c 69 73 65 72 20 75  |s du binaire .... et r..aliser u|
    12340060  6e 20 61 66 66 69 63 68 61 67 65 20 70 61 73 20 74 72 6f 70 20 64 c3 a9 67 75 65 75 00           |n affichage pas trop d..gueu.|

  4. #4
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    merci pour vos réponses,

    memcpy, ca marche pas .

    pour la deuxième réponse, j'ai pas bien saisi le paramètre d'entrée "offset" ni la valeur à donner pour NUM, merci de clarifier ça.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par souhailsou Voir le message
    memcpy, ca marche pas .
    oui bien sûr que ça "marche", ça a fait ses preuves depuis le temps

    j'ai pas bien saisi le paramètre d'entrée "offset" ni la valeur à donner pour NUM
    là encore n'hésite pas à faire quelque effort pour trouver par toi même surtout

    il suffit de regarder l'output proposé dans mon précédent message, l'offset passé en paramètre est 0x12340000 (pris au pif pour l'exemple) et dans l'output les adresses affichées commencent à 12340000, puis 12340020, 12340040 etc.

    quant à NUM c'est pareil, il suffisait de compiler et essayer de jouer avec la valeur pour se rendre compte que c'est simplement le nombre de valeurs qu'on veut afficher par ligne, la commande hexdump -C en affiche 16 par exemple par défaut, ici j'ai pris 32, c'est modifiable facilement.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par souhailsou Voir le message
    memcpy, ca marche pas
    Si si, elle fonctionne très bien, mais soit tu ne l'as pas utilisée correctement, soit elle ne correspond pas à ce que tu veux faire. Explique-nous comment tu t'en es servi, pourquoi elle ne fonctionne pas chez toi, et nous pourrons t'aider avec l'emploi de cette fonction.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void coap_dump(const uint8_t *buf, size_t buflen, bool bare)
    {
    int i=0;
    char * bu = (char *) malloc(100);
        if (bare)
        {
            while(buflen--)
     
    	 	printf("%02X%s", *buf++, (buflen > 0) ? " " : "");
     
    		memcpy(bu,&buf[5],buflen-7);
                    printf("%02X",bu);
    }}
    Voila la tentative avec memcpy, elle termine avec une segmentation fault soit avec malloc ou pas

    2) Pour la deuxième solution, j'ai intégré le code au sein de la fonction mais ça affiche une série octet alors que j'ai besoin de faire une juste copie de buf
    Je suis pas trop familiarisé avec l'environnement, c'est pour cela que mes questions paraissent un peu fondamentales.

    136c1100 ||
    136c1110 ||
    136c1120 ||
    136c1130 ||
    136c1140

    Merci d'avance,

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut


    Je suis pas trop familiarisé avec l'environnement
    c'est pas l'environnement c'est plutôt le langage à mon sens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    memcpy(bu,&buf[5],buflen-7); /* ici la copie est effectuée, ça répond à l'intitulé du topic tel que tu le décris */
      /* note que tu devrais avoir plus haut quelque chose du genre bu = malloc(buflen-7) et non pas malloc(100) */
    printf("%02X",bu);  /* <-- sauf que ça n'a pas de sens de faire ça */
    qu'est-ce que tu cherches à faire avec bu exactement ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    g mis alloué 30 pour éviter tout genre de problème allocation et de même pour l'affichage
    ca marche pas avec &buf[5], donc j'ai mis &buf+5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *bu ;
    bu = malloc(30);
        if (bare)
        {
            while(buflen--)
     
    	 	printf("%02X%s", *buf++, (buflen > 0) ? " " : "");
     
    		memcpy(bu,&buf+5,30);
                  printf("%02X",bu);}}

    et comme résultat j'ai obtenu

    bu : 40 01 1C 3A B3 69 70 36 C1

    buf : 02821EED0

    Réellement je cherche à avoir le code ASCII de la chaine buf à partir de position 5 jusqu'a buflen -7, voila tout simplement.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 374
    Points : 41 541
    Points
    41 541
    Par défaut
    Ben déjà, appeler une partie du buffer pointé "une partie de la valeur du pointeur", ça promet...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    ca marche enfin avec le memcpy merci à tous

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/03/2009, 12h45
  2. sélectionner une partie de la valeur d'une cellule
    Par Yoooo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/10/2008, 16h18
  3. Copie d'une partie de colonne en fonction d'un critère
    Par Cadenwarr dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/02/2008, 00h01
  4. calcul d'une partie de la valeur d'une cellule
    Par magictom42 dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 23/10/2006, 11h16
  5. Picklist: comment recuperer une partie de la valeur
    Par mesquest dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/06/2004, 08h54

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