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 Hexadecimal en unsigned char (peut-être pas ?)


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Convertir Hexadecimal en unsigned char (peut-être pas ?)
    Bonjour à tous,

    Je recherche à modifier un programme existant qui transfère des donnés via le réseau
    Mon but est de modifier un champ des datas qui transitent par ce logiciel en ajoutant l'adresse IP source du client

    client -> logiciel -> serveur

    Je récupère bien l'adresse source du client, ça c'est parfait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("IP address: is %s %x %x \n", adrIPp, s->sin_addr.s_addr, inet_addr("adrIPp"));
    Les datas quand à elle sont stockées dans un unsigned char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char fpdu[ctx->pdulen];
    Le datas qui me concernent sont précisément à l'emplacement mémoire 15

    J'ai maintenant récupéré pas mal d'infos et je pense avoir les pièces de mon puzzle, reste maintenant à assembler tout ça ....

    Ce que j'ai réussi à faire:

    Grâce à memcpy j'arrive à injecter à la volé (sans perturber le fonctionnement, ni segfault) des donnés dans le bon champs

    Pour le moment je fais un tableau de char dans lequel je copie l'IP en hexa que j'injecte ensuite via memcopy.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int sizearray = sizeof s->sin_addr.s_addr;
        sprintf(buffer, "%x", s->sin_addr.s_addr);
        memcpy(fpdu+15, src, sizearray);
    Bon c'est une première approche qui me permet de bien cibler le problème, cependant j'aimerais envoyer une IP et pas juste une suite de caractère (basé sur l'IP), du côté serveur j'ai le champ ip_client qui est bien remplit par une suite de chiffres fixent mais qui est bien différente pour chaque client.

    Je vois une solution, convertir l'IP en unsigned char et injecter les données avec un strcpy, mais je n'arrive pas à obtenir quelque chose qui tourne je pense sincèrement ne pas bien saisir ce que je fais (honte à moi je le reconnais, mais je ne suis pas dev )

    Si vous avez une idée je suis plus que preneur

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 670
    Points : 10 677
    Points
    10 677
    Par défaut
    opérateur décalage de bits vers la gauche <<, et celui vers la droite >>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned char part_1, part_2, part_3, part_4; // IPv4: part_1.part_2.part_3.part_4
     
    // ...
     
    unsigned long int_IPv4 = ((part_1 << 24) + (part_2 << 16) + (part_3 << 8) + part_4);
    peut-être forcer les parties en unsigned long si cela ne fonctionne pas du style (((unsigned long) part_3) << 8)


    Édit 1 : Et au cas où ... et avant que tu le demandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define L_16(X) (X & 0X00FF)
    #define H_16(X) ((X >> 8) & 0X00FF)
     
    #define LL_32(X) (X & 0X000000FF)
    #define LH_32(X) ((X >>  8) & 0X000000FF)
    #define HL_32(X) ((X >> 16) & 0X000000FF)
    #define HH_32(X) ((X >> 24) & 0X000000FF)
    Édit 2 : Il faut utiliser des types non signés unsigned long (ou éventuellement uint32_t)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Je comprends pas ce que tu racontes.
    Mais une IP (v4) c'est 4octets soit 32bits et pas 14 caractères.
    https://docs.microsoft.com/en-us/win...nsock2-in_addr

Discussions similaires

  1. Handle peut être pas initialisé
    Par crassetph dans le forum Langage
    Réponses: 1
    Dernier message: 21/03/2008, 12h52
  2. Réponses: 2
    Dernier message: 29/02/2008, 08h06
  3. Réponses: 20
    Dernier message: 02/02/2008, 22h14
  4. Convertir CString en const char*: ca marche pas
    Par MDiabolo dans le forum Visual C++
    Réponses: 12
    Dernier message: 21/11/2006, 18h10
  5. Problème de variables peut être pas intialisées
    Par gregory.bts dans le forum Langage
    Réponses: 14
    Dernier message: 12/10/2006, 09h55

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