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 :

Comment convertir un array en byte


Sujet :

C++

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Comment convertir un array en byte
    Bonjour,

    Je charhe a convertir un array en byte.

    mon array (char) est la suivante

    dird3
    Pour etre complet, je dois séparé le 3 de dird.
    Je le fais comme ca
    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
     
    if(!strncmp(inSerial,"dird",3)){
          #ifdef DEBUG
            Serial.println(F("DELETE IN THE PHONE DIRECTORY"));
            Serial.println(F("--------------------------------"));
            Serial.println(F("In progress, wait..."));
          #endif
     
           // Ici j'affiche le trois
           Serial.println(inSerial[4]);
     
          //En suite j'ai besoin de ce trois pour une fonction
          gsm.DelPhoneNumber(inSerial[4]);
     
    // Il devrait effacer le numero qui se trouve a la position 3
     
    }
    Il devrait effacer le numero qui se trouve a la position 3, simplement ca ne marche pas.
    Si je fais ca, ca marche
    Le truc c'est que la fonction gsm.DelPhoneNumber(byte position);
    attend un byte dont voici un extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char GSM::DelPhoneNumber(byte position)
    {
      char ret_val = -1;
     
      if (position == 0) return (-3);
      if (CLS_FREE != GetCommLineStatus()) return (ret_val);
      SetCommLineStatus(CLS_ATCMD);
      ret_val = 0; // phone number was not written yet
    Donc si j'ai bien compris je dois transformé la valeur de inSerial[4] (3) pour l'avoir en byte, mais qi doit toujours etre trois, forcément.

    Et la je ne sais pas comment faire. J'ai essayé ceci
    byte tot = (byte)inSerial[4];

    Mais sans succes.

    Comment puis je faire pour que 'position' de ma fonction DelPhoneNumber() recupère le bon numero??

    Milles mercis
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    DelPhoneNumber() attend une position, et tu lui envoies un caractère.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    J'ai trouvé comment comnvertir un char en array, mais uniquement pour un caractere

    Par exemple j'ai dir4 (char) et le veux en byte, je fais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Je prend le caractere a la 4eme position
    (byte)(inSerial[4] - '0')
    Maintenant si j'ai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char caract[3];
    caract="234"
    Comment puis-je converti 234 en byte, car là, je ne peux plus me limiter sur un caracter vu que j'en ai 3 pour faire 234?

    Mercis
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    ho mais oui, mais j'ai besoin d'un byte pas d'un int.

    Es-ce que c'est aussi valable pour un byte?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Homer J. Simpson


  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Ok merci,
    Y a aussi un truc que je ne comprends pas ou alors ca été le hasard.

    J'avais un fonction comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void myFunction(byte by, char * ch){
    }
    On est d'accird que le premier parametre doit etre un byte et le second un char.

    J'aidonc fait ceci:

    Le 1 est passé, pourtant c'est un int?

    Donc si je fais ca

    int test=1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFunction(test,unChar);
    ca va aussi fonctionner?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il faut faire très attention à ce que l'on veut, car, le terme byte représente, normalement, un "ensemble de bits suffisant pour représenter l'ensemble d'un jeu de caractère donné".

    autrement dit, un byte est souvent assimilé à ce que l'on appelle (de manière tout à fait erronée) un octet.

    La raison en est que le premier jeu de caractères que l'on a utilisé était ce que l'on appelait la table ASCII (American Standart Code for Information Interchange), qui était composée de 128 caractères, et donc représentables sur 7 bits consécutifs plus 1 pour indiquer le signe et qui était suffisante pour représente l'ensemble des caractères que l'on pouvait souhaiter représenter en anglais.

    Par la suite, il est apparu que cette table de caractères n'était pas suffisante pour représenter l'ensemble des caractères utilisés dans les différentes langues (penses, simplement, aux caractères accentués utilisés en français, à la manière de représenter un G majuscule en allemand ou aux différents caractères des langues orientales ).

    Une (en fait plusieurs) tables de caractères ont alors été mises au point et portent (bon, je vais simplifier un peu, sans que cela ne nuise trop à la compréhension) le terme de "unicode".

    Ces tables utilisent un plus grand nombre de bits, simplement, parce qu'il n'y a pas assez de valeurs possibles pour représenter l'ensemble du jeu de caractères si on est limité à 8 bits (ce qui fait 256 combinaisons possibles comprises dans l'écart [0,255[).

    Microsoft a donc créé un symbole préprocesseur nommé BYTE qui permet d'indiquer que l'on travaille soit avec des caractères stockés sur 8 bits (si on ne travaille pas en unicode) soit avec des caractères stockés (je simplifie toujours) sur 16 ou sur 32 bits si on travaille en mode unicode.

    Sous windows, un BYTE va donc représenter un type "primitif" qui est composé d'un nombre clairement déterminé de bits.

    Pour rappel, un bit n'est jamais (je simplifie pour l'explication, toujours) qu'une sorte d'interrupteur qui peut laisser passer (ou non) le courent, et qui a donc deux états distincts: 1 le courent passe ou 0 le courent ne passe pas.

    Mais ce qu'il faut comprendre surtout, c'est que le BYTE, quelle que soit sa taille (8 ou 32 bits), ne pourra jamais représenter qu'un nombre bien déterminé de valeurs, et donc de caractères.

    Le problème, c'est qu'un array n'est jamais qu'un ensemble d'éléments de type identique consécutif en mémoire.

    Ainsi, si on a une structure du genre de (c'est plutot à la mode C, mais ce sera parfait pour l'exemple )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Personne{
        char nom[15];
        char prenom[15];
    };
    c'est une structure qui prendra à elle seule un espace équivalent à trente bytes en mémoire afin de pouvoir contenir les 15 caractères qui permettent de représenter le nom et les 15 caractères qui permettent de représenter le prénom (en fait, j'aurais du dire à chaque fois les 14 caractères significatifs + le '\0' terminal pour être juste )

    Les champs nom et prénom sont déjà ce que l'on appelle des arrays, et peut etre commences tu à comprendre où le problème se situe dans ta question...

    Mais lorsque je t'aurai, en plus, dit qu'il est tout à fait possible de créer un array de personne, par exemple, sous la forme de
    cela deviendra encore plus clair.

    En effet, si chaque élément de type Personne a déjà besoin d'un espace correspondant à 30... bytes pour pouvoir représenter ses données, la variable tableau aura besoin d'un espace mémoire équivalent à ...30*10 = 300 byte pour pouvoir représenter l'ensemble des personnes qu'il contient!

    Comment voudrais tu, dés lors, arriver à faire tenir les 30, ou pire, les 300 bytes nécessaire à la représentation de ces données dans un seul

    C'est, disons le tout de suite, purement et simplement impossible.

    Par contre, j'espère avoir insisté à suffisance sur ce fait, tous les éléments que tu vas manipuler vont être "physiquement" représentés en mémoire, et donc accessibles à une adresse qui leur est propre.

    Et pour représenter l'adresse d'un élément, on dispose d'une possibilité de choix: les pointeurs.

    On peut donc considérer l'adresse à laquelle commence le premier élément de tableau, ou que l'adresse à laquelle commence le prénom du troisième élément de tableau (voire meme l'adresse à laquelle se trouve la cinquième lettre du nom du 8 eme élément de tableau) est l'adresse à laquelle se trouve un caractère.

    Si le nombre de bits nécessaire à la représentation d'un BYTE est identique au nombre de bits nécessaire à la représentation d'un char (ce qui est le cas si tu ne travailles pas en unicode), tu n'auras aucun soucis à te faire, et, si tu as besoin du BYTE en lui-même, tu peux "allègrement" soit prendre purement et simplement le caractère qui t'intéresse, soit utiliser "ce qui est pointé" par le pointeur correspondant.

    Par contre, si tu travailles en unicode et que tu as utilisé le type char pour la représentation du nom et du prénom de ta structure Personne, il faudra trouver le moyen de convertir tes caractères ASCII en caractères unicode, autrement, tu risques par mégarde d'utiliser... plusieurs caractères ASCII pour représenter un seul caractère unicode, et ca, ce ne serait vraiment pas une bonne idée

    Maintenant que ces choses sont mises au point, es tu sur de vouloir convertir un array en byte, ou veux tu "simplement" pouvoir récupérer un byte spécifique à l'intérieur d'un array
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par koala01 Voir le message
    autrement dit, un byte est souvent assimilé à ce que l'on appelle (de manière tout à fait erronée) un octet.
    Et le C++ ne nous aide guère non plus, en nous laissant penser qu'un caractère à une taille fixe : sizeof(char) est toujours égal à 1.

    En fait, le type char ne devrait même pas exister. Ou alors sous cette forme : char_8t.

  10. #10
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    j'ai relu plusieurs fois ce sujet depuis plusieurs jours, et j'ai vraiment l'impression que tu ne sais pas ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char GSM::DelPhoneNumber(byte position)
    N'attend pas un byte, c'est anecdotique ça, il attend une position, comme son nom l'indique. Qui est l'index du caractère à effacer (je suppose, vu le nom) dans la chaîne. Pour une fois que les méthodes semblent claires, c'est bien dommage de ne pas en tenir compte..
    Et que je serais pas surpris que pour "effacer le 4° caractère" il suffise de faire un DelPhoneNumber(4);, ou peut-être 5.


    Enfin, "transformer" en byte, ou en quoi que ce soit, ça me fait directement penser à ni plus ni moins qu'un reinterpret_cast.
    Mais bon, tu as déjà un char*, alors je vois pas trop en quoi tu voudrais le cast.. en général c'est du cast vers char* justement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* str = "dird3";
    str[4] = 0;
    et voilà, il n'y a plus de "3" en fin de chaîne..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* str = "dird3";
    str[3] = 0;
    et voilà, il n'y a plus de "3" en fin de chaîne..
    Il va plutôt y avoir "dir03" non?

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par Bysbobo Voir le message
    Il va plutôt y avoir "dir03" non?
    Non, un byte nul ne code pas le chiffre 0, mais la fin de chaîne de caractères...
    Pour représenter le chiffre 0 il faut mettre le code ASCII du caractère '0', qui est 48 en décimal (généralement on le note en hexadécimal comme suit: 0x30)

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Ceci dit, le 3 étant le 5ème caractère de la chaîne, si on ne veut effacer que lui, il me semble qu'il faudrait mettre le NULL (valeur 0) à l'indice 4 (4 parce que le premier caractère porte l'indice 0).

  14. #14
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Avant, j'avais un cerveau. mais ça c'était avant...

    Alors sur ce site de table ASCII
    003 : ETX : End of Text

    je comprends pourquoi c'est le dernier caractère! OK

    Ce que je comprends moins c'est que char *str est (et là j'ai peur de dire une bétise) considéré comme un tableau de char (ouille?).
    Donc, si j'ai pas loupé un épisode, l'indice est un entier mais pas un ASCII

    De même pour ton dernier post, pas compris la logique

    Désolé de poser des questions sur des sujets que je n'ai pas ouvert mais j'essaye de comprendre ^^

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Plus exactement, l'indice est de type size_t, un type entier assez grand pour contenir les indices du plus grand tableau possible.
    Concernant le fait qu'on utilise l'indice 4 pour le cinquième caractère, c'est assez simple: en informatique on numérote beaucoup de chose, dont les indices, en partant de 0. Donc si le premier caractère a pour indice 0, le second 1, on voit que l'indice est toujours une unité plus petite que le rang. Du coup pour le cinquième caractère, on a l'indice 5-1=4

  16. #16
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Oui bon à une vache près d'index, vous m'avez compris

    @Bysbobo, il faudrait peut-être lire un cours, les tableaux ont leur index 0-based, ça doit être une des premières leçon, et c'est vrai pour une grande majorité de langages.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  17. #17
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et le C++ ne nous aide guère non plus, en nous laissant penser qu'un caractère à une taille fixe : sizeof(char) est toujours égal à 1.

    En fait, le type char ne devrait même pas exister. Ou alors sous cette forme : char_8t.
    En fait, sizeof est défini pour que sizeof(char) soit toujours égal à 1.
    En théorie, rien n'empêche un char d'avoir une taille différente que 8 bit mais dans la pratique ce cas là est quasiment inexistant.

    En revanche il est vrai que char est mal nommé car on oublie que c'est un entier et qu'à chaque valeurs que peut prendre cet entier (ou un groupe de ces entiers) est associé un caractère selon l'encodage utilisé.

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Bysbobo Voir le message

    Alors sur ce site de table ASCII
    003 : ETX : End of Text

    je comprends pourquoi c'est le dernier caractère! OK
    En fait, ce caractère permettait plutôt de représenter la toute fin d'un texte (ce qui, en alphabet morse, correspond à .-.-.-, ou, pour un fichier, à la valeur EOF).

    Il ne faut pas oublier que l'ASCII a, d'abord, été utilisé pour des appareils qui envoyaient leurs réceptions sur du papier, et qu'il fallait donc pouvoir indiquer que le texte était fini.

    Ici, on parle de la fin d'une chaine de caractères, et, bien que les caractères de 0 (0x0) à 31 (0x19) soient considérés comme non affichables (avec, malgré tout certaines exceptions comme 'CR/CRLF' ou 'TAB'), c'est bel et bien le premier caractère NULL ('\0') qui est considéré, lors de l'évaluation de la taille (entre autres) d'une chaine de caractères, comme la fin de celle-ci.

    Le '3' dont tu parles est bel et bien le caractère 3, dont la valeur est 51 (0x31) et pourrait parfaitement être remplacé par n'importe quoi d'autre, comme 'a' ou 'N'
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Comment convertir un tableau de byte en un float ?
    Par alex140025 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 03/08/2011, 18h53
  2. Réponses: 5
    Dernier message: 18/11/2005, 22h11

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