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
    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

    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
    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

    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 ;

    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é
    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é
    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

    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