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 :

Conversion de données


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut Conversion de données
    Bonjour,

    J'ai deux séquences de 64 bits en hexa que j'ai codé dans des variables de type unsigned long long int.

    En entrée je réçois des données de type unsigned char que je voudrais convertir en unsigned long long int afin de comparer la valeur hexadécimal que je reçois en entrée avec les deux séquences fixées précedement.

    Comment convertir unsigned char en unsigned long long int?

    Merci en avance pour votre aide,

    Irene

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu veux dire des suites de unsigned char, ou juste un unsigned char à comparer (je ne sais pas comment) à des unsigned long long int ?
    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.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Au fait j'ai un flux de données qui arrive (je code un block pour GNU Radio) au format unsigned char donc mon but était de convertir chaque unsigned char en unsigned long long int, puis décaler les données et venir y "concatener" chaque unsigned char converti.

    Le code en python ressemble à ceci (sauf que là j'avais pas des questions à me poser concernant le type des données) :


    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
     
    Frame_1 = 0x F3 FF 01 C6 A6 51 0F 95
    Frame_2 = 0x 33 AA 55 C6 65 9A 0C 59
     
    Sequence = 0
     
    for i in range(...):
       Byte = arrTxt[i]                              # arrTxt = données en entrée 
       for j in range (8):
          b0 = ((Byte >> (7-j)) & 0x1)
          Sequence ((Sequence << 1)+ b0) & 0xFFFFFFFFFFFFFFFF
          if (Sequence == Frame_1):
             # Frame 1 a été retrouvé
          if(Sequence == Frame_2):
             # Frame 2 a été retrouvé
    Je cherche à coder ça en c++.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Une solution à laquelle j'ai pensé ce serait de récupérer la valeur hexadécimale des caractères non signés et la stocker dans une variable de type unsigned long long int.

    Quel est l'équivalent de la fonction python ord(char) en c++?
    Comment récupérer la valeur hexadécimale d'un caractère?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    La valeur hexa du caractere tu l'as deja. C'est avec elle que le programme manipule ton caractere.

    J'imagine que ton probleme c'est d'afficher ce caractere en hexa. C'est a dire, d'empecher le programme de te le traduire a l'aide de la table ASCII.

    Je te donne la fonction que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string bin2str(uint8_t data)
    {
        ostringstream oss;
        oss << hex << (int) data;
        string str = oss.str();
        if(str.size() == 1) str = "0" + str;
        return str;
    }
    Avec un petit tour dans la FAQ tu devrais avoir une explication sur ce code. Sinon je repasserais.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    J'ai vu ce code sur d'autres forums, mais j'ai lu que le fait d'utiliser ostringstream ralentit extrèmement (à confirmer vu que je m'y connais pas personnellement) et j'ai des fortes contraintes temps-réel vu qu'il s'agit de traiter un flux.

    Par ailleurs les séquences que je recherche sont constituées de 64 bits non signés donc je pense que le fait d'utiliser le type de variable 'string' n'est pas possible c'est pourquoi j'utilise des unsigned long long int. (Je suis ouverte à d'autres solutions si quequ'un a une autre idée).

    Par contre les données réçues se trouvent au format 'unsigned char'. Je voulais récupérer la valeur hexadécimale en sorte à la stocker sous forme d'un unsigned long long int afin de pouvoir la comparer avec les séquences de 64 bits dont je vous parlais.

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Le caractère correspond à un nombre codée sur 8 bits entre 0 et 255, donc finalement il n'y a pas vraiment à "récupérer" sa valeur hexadécimale car c'est exactement la même chose que la valeur entre 0 et 255.

    Là tu veux apparemment comparer des suites de valeurs hexadécimales pour savoir si tu trouves des motifs particuliers ce qui équivaut à comparer des chaines de caractères.

    Il y a plein de façons différentes de faire, si on suit ton idée qui consiste à créer et comparer des nombres unsigned long long int, il faut utiliser les décalages de bits :

    Si je ne me trompe pas :

    le nombre unsigned long long = (unsigned long long)1er caractère << 56 + (unsigned long long)2eme caractère << 48 + ... + (unsigned long long)7ème caractère << 8 + (unsigned long long)8ème caractère

    Sinon on peut aussi créer un tableau de char :

    char tab[9];
    tab[0] = 1er caractère
    ...
    tab[7] = 8ème caractère
    tab[8] = '\0'

    et utiliser les fonctions de comparaison de chaines de caractère.

Discussions similaires

  1. Conversion de donnée
    Par elfyx dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/02/2007, 08h48
  2. Conversion de données
    Par noratec dans le forum Access
    Réponses: 3
    Dernier message: 17/03/2006, 17h50
  3. Conversion de données
    Par charliejo dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/01/2006, 09h59
  4. Pb de conversion de données 16 vers 32
    Par Ducmonster dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2005, 11h53
  5. [JSTL] [SQL] Conversion de données
    Par GiHe dans le forum Taglibs
    Réponses: 4
    Dernier message: 27/09/2005, 10h01

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