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 :

[debutant]convertion string -> uint_64


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Par défaut [debutant]convertion string -> uint_64
    Voila je travaille sur un algo de chiffrement et je souhaite convertir une chaine de caractere(un "string") en "bloc de 64 bites (j'utilise des "uint64_t")...
    je n'arrive pas trouver de fonction en C pouvant realiser ce type d'operation...
    merci d avance!

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    strtoull retourne un unsigned long long (qui est generalement uint64_t)
    http://man.developpez.com/man3/strtoul.3.php
    Cette fonction est C99 (pas C ANSI)

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 Gruik
    Cette fonction est C99 (pas C ANSI)
    C99 est tout ce qu'il y a de plus ANSI (ANSI 2000, pour être plus précis). Par contre, c'est différent de C90 (ISO) et de C89 (ANSI).

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui mais il est courant de dire C ANSI = C89

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 Gruik
    Oui mais il est courant de dire C ANSI = C89
    Non, tu confonds avec le flag de gcc '-ansi' qui signifie dans les versions les plus récentes '-std=c90'.

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui c'est vrai, okay

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Par défaut
    apres avoir testé la fonction la strtoull et j'ai l'impression qu'elle converti un "string d'hexa' en decimal...

    je m'explique:
    strtoul("1f",'\0',16);
    va me renvoyer la valeur 31 en int par exemple

    or ce que je souhaite, c'est une fonction ki me prenne en argument un char ou un string et qu'elle me renvoie sa valeur en codé en hexa...
    exemple: uint64_t fonction ("abdcedds") -> 0x.....

    merci

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    ......
    Hexa ou decimal, c'est qu'une representation d'un entier...


    Et sinon, strtoull ne prend pas forcement une chaine representant un nombre hexa, si tu passes 10 pour l'argument "radix" ça marche pour les nombres exprimés en décimal.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 tigrou93
    apres avoir testé la fonction la strtoull et j'ai l'impression qu'elle converti un "string d'hexa' en decimal...

    je m'explique:
    strtoul("1f",'\0',16);
    va me renvoyer la valeur 31 en int par exemple

    or ce que je souhaite, c'est une fonction ki me prenne en argument un char ou un string et qu'elle me renvoie sa valeur en codé en hexa...
    exemple: uint64_t fonction ("abdcedds") -> 0x.....

    merci
    Beaucoup de confusions ici...

    D'une part, on a la représentation textuelle d'une valeur numérique, qui peut être, par exemple,
    binaire : "001101001"
    octale : "5437260"
    décimale : "209129"
    héxadécimale : "70A5F67"

    et d'autre part, il y a la valeur numérique elle même, qui, en informatique, est une combinaison de 0 et 1, donc binaire pure.

    Si je prends la combinaison binaire 10100101, telle qu'elle est codée dans la machine, il est possible de la représenter textuellement :
    1010 0101, c'est à dire A5 en hexadécimal, soit, si j'en crois ma calculatrice, 165 en décimal ou encore 245 en octal.

    Le langage C offre des possibilités pour définir une valeur numérique constante. Par exemple :

    Décimal : une séquence de chiffres 0 à 9 :
    Octal : une séquence de chiffres 0 à 7 commençant par 0 :
    Hexadécimal : une séquence de chiffres 0 à 0 et de lettres a à f en minuscule ou en majuscule commençant par 0x ou 0X :
    La représentation textuelle est à chaque fois traduite en valeur binaire 10100101. Le C n'a pas de moyen de représenter une constante sous forme binaire, le chois décimal, octal ou hexadécimal sera dicté par l'usage et la représentation mentale qu'on se fait de la valeur. Il est clair que notre culture numérique étant basée sur le système décimal, on aura tendance naturellement à exprimer les quantités, tailles et autres grandeurs en décimal. Par contre, les représentations octales et hexadécimales sont pratique dès qu'il s'agit de représenter des combinaisons de bits. En effet ces deux tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    0 000
    1 001
    2 010
    3 011
    4 100
    5 101
    6 110
    7 111
    et
    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
     
    0 0000
    1 0001
    2 0010
    3 0011
    4 0100
    5 0101
    6 0110
    7 0111
    8 1000
    9 1001
    A 1010
    B 1011
    C 1100
    D 1101
    E 1110
    F 1111
    S'apprennent par coeur assez vite et permettent rapidement de penser en binaire avec une représentation simple et lisible. Par exemple :

    01100110100100 s'écrit facilement en octal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 - On groupe par trois en partant du LSB        :  01 100 110 100 100
    2 - On complète avec des 0                       : 001 100 110 100 100
    3 - On attribue un chiffre a chaque trio de bits :   1   4   5   4   4
    4 - On ajoute un 0 en tête et on regroupe        :              014544
    Idem en hexadécimal, mais par groupes de 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 :   01 1001 1010 0100
    2 : 0001 1001 1010 0100
    3 :    1    9    A    4
    4 :              0x19A4
    Le C offre aussi la possibilité de convertir une chaine de caractères représentant une valeur numérique. C'est ce que fait par exemple strtol(), qui accepte un texte représentant une valeur en base 2 à 36. La conversion s'arrête dès qu'un caractère inconnu est détecté.

    Si le paramètre de base est compris entre 2 et 36, les 0 en tête sont ignorés, et le format du C 'hexadécimal' ("0x...") est acceptés pourvu qu'il soit cohérent.

    Si le paramètre base vaut 0, une détection du format est faite automatiquement sur la base des formats des constantes numériques en C, à savoir

    123 -> interprété comme une représentation décimale
    0123 -> interprété comme une représentation octale
    0x123 -> interprété comme une représentation hexadécimale.

    La valeur résultant de la traduction est une valeur numérique. Elle n'a pas de 'base'. Il se trouve simplement que dans un ordinateur, elle est 'matérialisée' par une combinaison d'états électrique pouvant prendre 2 valeurs, c'est à dire une combinaison de valeurs binaires. C'est tout ce qu'on peut dire. La représentation textuelle est toujours une interprétation.

    Inversement, la valeur numérique peut être utilisée pour construire une chaine de caractère représentant la chaine en décimal, octal ou héxadécimal, à l'aide de *printf().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       int x = 165;
     
       printf ("decimal : %d\n", x);
       printf ("octal : %o\n", (unsigned) x);
       printf ("hexadecimal : %x\n", (unsigned) x);
    Nota : "%o" et "%x" n'acceptent que des valeurs non signées.

    C'est plus clair maintenant ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/12/2005, 12h01
  2. [C#][debutant] tableau String sans donner la taille ?
    Par Sylk dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/11/2005, 20h42
  3. [Debutant]Transformer string en int
    Par htaou dans le forum SL & STL
    Réponses: 7
    Dernier message: 09/09/2005, 21h28
  4. Convertion string => entier
    Par en_gel_ho dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/06/2005, 12h59
  5. convertion string --> long
    Par JulienT dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2005, 23h05

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