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

Delphi Discussion :

Découpage de bytes


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Découpage de bytes
    Bonjour,

    Je récupère des paquets via le port COM que je dois traiter ensuite.
    Notament, dans ce paquet, il y a un timestamp sur 4 bytes répartis de cette manière:
    seconds (6 bits)
    minutes (6 bits)
    hours (5 bits)
    days (5 bits)
    months (4 bits)
    years (6 bits)

    N'ayant jamais fait ce genre de chose, je vous demande de l'aide.

    (Il faut transformer en binaire et recopier la longueur voulue dans un byte en rajoutant des 0 devant, nan ?)

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    pour récupérer des parties il faut utiliser les opérateurs binaires, les masques et les décalages.
    Il n'y a pas de "transformation" a faire, un nombre est un nombre, il est représenté sous forme binaire, hexa ou décimale.

    Pour les minutes par exemple, qui sont dans la zone

    MaVar = 00000000 00000000 000001111 11000000

    1. tu décales de 6 bits vers la droite (pour éliminer la zone des secondes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVarTemp := MaVar shr 6;
    2. puis tu masques selon la taille à récupérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Minutes := MaVarTemp and $3F
    étant donné de $3F est un masque sur les 6 1ers bits

    ainsi de suite pour toutes tes zones

    bonc code :

    :EDIT:
    pour l'opération inverse, il faut faire qqchose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MaVar := ( Secondes and $ 3F ) + ( Minute and $ 3F ) shl 6 + (heure and $1F ) shl 12 + ...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Ok, merci... Je vais essayer ça tout de suite !

    Heu, juste comme ça... MaVar, tu la vois de quel type ? array[0..3] of Char ?

    Et tu l'initialiserais comme ça:
    maVar[0] := tampon[nblu-4];
    maVar[1] := tampon[nblu-3];
    maVar[2] := tampon[nblu-2];
    maVar[3] := tampon[nblu-1];

    Nan ?

  4. #4
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Salut,

    Je pense qu'il faut prendre le type LongWord , 32 bits non signés.

    Pour l'initialiser, ceci pourrait faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var 
      MaVar: LongWord;
      i: Integer;
    begin
      for i := 0 to 3 do MaVar := MaVar + LongWord( tampon[ i ] ) shl ( i * 8 )
      ...
      // ou (3 - i ) en indice du tableau selon l'ordre de réception... ?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bon, ca ne marche pas...

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
              temp := '';
              MaVar := 0;
              for j := 0 to 3 do begin
                MaVar := MaVar+LongWord(tampon[nblu-4+j]) shl (j*8);
                temp := temp+'('+IntToStr(Integer(tampon[nblu-4+j]))+')';
              end;
              maVarTemp := maVar shr 6;
              temp := temp+'>'+IntToStr(MaVarTemp and $3F);
    Il m'affiche toujours 22, les bits sont pourtant bien les bons.

    Voici les 4 bits pour 11:28:37 AM 8/31/06: (149)(197)(254)(6)
    149 en binaire donne: 10010101
    Les 6 premiers bits sont: 100101 et ça fait bien 37 secondes !

  6. #6
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    non c correct

    attention à l'ordre des bits.
    dans ton exemple, tu as les bytes succ stockés:
    (149)(197)(254)(6)

    -> ton binaire final est donc le suivant, en prenant 149 en 1er de droite à gauche:

    0000 0110 1111 1110 1100 0101 1001 0101

    Après le shr 6 -> on décale ce binaire de 6 vers la droite ce qui donne
    0000 0110 1111 1110 1100 0101 10, en regroupant pour le visuel:
    00 0001 1011 1111 1011 0001 0110

    Ensuite le masque prend les 6 derniers bits qui sont
    01 0110

    --> ce qui fait bien 22
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découpage d'un tableau de byte(byte[])
    Par Nico_stras dans le forum C#
    Réponses: 1
    Dernier message: 21/05/2007, 11h49
  2. [C#] Conversion d'un byte[] en byte *
    Par karsh dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/12/2004, 11h53
  3. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 21h42
  4. Réponses: 10
    Dernier message: 17/12/2003, 14h51
  5. transtyper ^dword en ^byte ?
    Par - Robby - dans le forum Langage
    Réponses: 3
    Dernier message: 28/10/2003, 01h58

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