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

Embarqué Discussion :

Plus qu'un unsigned long long int !


Sujet :

Embarqué

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Plus qu'un unsigned long long int !
    Bonjour,

    Je suis en train de construire un appareil IoT avec SigFox (alternative à LoRa).
    SigFox ne permet l'envoi que de 12 octets.

    J'ai cette chaîne, qui est à l'origine un int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    53201250225225725098536002361012
    J'aimerais la transformer en tableau binaire.

    Actuellement, la représentation binaire de la décimale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    53201250225225725098536002361012
    est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10101011 11100111 00001010 11110001 10101111 00001101 11001011 10010111 11010001 10110111 10010110 10110100
    , soit 12 octets.

    Comment passer d'une chaîne représentant une décimale à un tableau binaire de cette décimale ? (langage C)

    Merci par avance.

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Ton problème est mal expliqué.

    53201250225225725098536002361012 c'est quoi ? Une chaîne de caractères ? C'est la valeur 5, suivie de la valeur 3, suivie de la valeur 2, etc ? C'est la valeur 53, suivie de la valeur 20, suivie de la valeur 12 ?


    Citation Envoyé par flavb83 Voir le message
    Actuellement, la représentation binaire de la décimale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    53201250225225725098536002361012
    est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10101011 11100111 00001010 11110001 10101111 00001101 11001011 10010111 11010001 10110111 10010110 10110100
    , soit 12 octets.
    Alors là il faut que nous explique comment tu es passé de l'un a l'autre ?

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    J'ai utilisé ce site : https://www.rapidtables.com/convert/...to-binary.html pour obtenir ce résultat binaire.

    Mon "53201250225225725098536002361012" est bien une chaîne de caractères, mais que j'aimerais convertir en entier, puis en binaire. Au format que le site me renvoi.

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Si tu as entré une telle valeur sur ce site je ne suis pas surpris que le résultat soit faux. Même un PC avec une variable unsigned long long int ne peut pas contenir un tel nombre.


    Je vais t'apporter des éléments de réponse mais à mon avis tu es dans l'erreur avec ta trame SIGFOX.

    Citation Envoyé par flavb83
    Mon "53201250225225725098536002361012" est bien une chaîne de caractères
    Ok, la question qui suit c'est comment est elle composée ?
    "5" "32" "0" "125" ... ?
    "53" "20" "12 "50" ... ?
    "53" "201" "250" "225"... ?
    Si tu ne le sais pas, c'est simplement impossible de répondre. Exemple, 20 en binaire ça donnerait 0001 0100 et 201 donnerait 11001001.

    Une chose est sur c'est que cette chaîne ne peut pas représenter un seul nombre, c'est impossible car aucun type de variable ne peut la contenir. Même si tu utilises la fonction atoi() en C et qui sert précisément à convertir une chaîne de caractère en entier, tu ne peux pas y entrer une telle longueur. Ça déconnera exactement comme avec le site internet (débordement de variable).


    *********************************************************************


    Maintenant voilà ce que je pense ;
    Nom : Sigfox-MAC-frame-structure.jpg
Affichages : 252
Taille : 45,7 Ko
    Tu es entrain de travailler sur le registre payload qui peut contenir jusque 12 octets d'informations. Ces 12 octets peuvent être composés comme bon te semble (c'est pour ça que personne ne peut te répondre), par exemple tu peux la composer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Température : 1 octet] [Humidité : 2 octet] [Heure : 1 octet] [Minute : 1 octet] [Seconde : 1 octet] [Entrée ana1 : 2 octets] [Entrée ana2 : 2 octets] [Batterie : 2 octets]
    Voilà, ici tu as un exemple d'une trame payload de 12 octets.

    Si tu réceptionnes cette trame et que tu l'affiches en décimal ça peut donner ça : 20 700 2 30 17 664 3000 65400 ou ça 23 37000 17 43 27 17003 24145 60 ou ....... (j'ai été sympa j'ai pas collé toutes les valeurs entres elles sinon ça donné ça 2070023017664300065400 ou 2337000174327170032414560)


    Si tu ne nous donnes pas la composition de la trame on ne peut pas répondre.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    D'accord avec les réponses données, l'énoncé n'est pas compréhensible.
    Si tu veux encoder une telle séquence ASCII composée uniquement de valeur numérique, tu peux utiliser une séquence de int (4 octets) ou "long long" (8 octets).
    Par exemple avec l' unsigned int tu peux coder jusqu'à 4294967295, soit 10 digits.
    Pour le ULLONG : 18446744073709551615, soit 20 digits.
    Tu as 32 digits dans ta chaîne, soit au moins 4 uint, donc 12 octets. ... A vérifier mais ça peut passer, car tu as une réserve de 8 digit.
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    Si besoin il est toujours possible de compresser les listes d'entier : https://github.com/lemire/LittleIntPacker
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour à tous

    Je partage l'incompréhension de mes collègues.

    Ensuite ton entier en y mettant la forme: 53 201 250 225 225 725 098 536 002 361 012 on voit que c'est 53 * 100010. Et mis sous cette forme me permet d'estimer qu'il faut 106 bits (ou alors 105 vu que cela est légèrement surestimé) pour l'écrire en binaire et c'est plus que la longueur de 12 bytes (96 bits).

    Moi, je comprends ta question de transformer un entier énorme représenté sous sa forme décimale en string dans sa forme binaire (et là c'est égal car c'est juste une convention d'écriture). Cela la norme C ne le prévoit pas au delà de 64 bits. Reste les bibliothèques "Big Int", je te laisse chercher ce qui est disponible sur ta plateforme, ou à la manoille. Mais de toute manière la conversion sera très coûteuse en temps de calcul (à grand coup de multiplication ou de division). Je ne me suis jamais vraiment lancé là dessus.

    Mais dans le cadre de ton projet, est-ce que tu ne peux pas récupérer le nombre sous une forme meilleure qu'un décimal en string? Par exemple un tableaux d'entier, ou alors en string mais au format hexadécimal bien plus facile à découper?

    Bonne suite

    Delias

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/03/2011, 16h10
  2. Verifier la valeur d'un unsigned long int
    Par Johor dans le forum C
    Réponses: 21
    Dernier message: 28/03/2008, 15h11
  3. Réponses: 1
    Dernier message: 17/10/2007, 14h01
  4. unsigned long long int
    Par salseropom dans le forum C
    Réponses: 10
    Dernier message: 21/12/2006, 22h43
  5. petit probleme avec un (unsigned long int)
    Par Micks71 dans le forum C
    Réponses: 6
    Dernier message: 19/05/2006, 12h08

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